2

以下のようなコードスニペットがあり、それぞれが独自の接続を持つ2つの異なる関数にリファクタリングしたいと思います(メンテナンスを改善するため)。

Dim Conn, Sql, RS

Set Conn = Server.CreateObject("ADODB.Connection")
    Conn.Open ConnString

Sql = SELECT * FROM CLIENTS

Set RS = Conn.Execute(sql)
//'Do something with Clients

Set RS = Nothing

Sql = SELECT * FROM DEALERS

Set RS = Conn.Execute(sql)
//'Do something with Dealers

Set RS = Nothing

Conn.Close
Set Conn = Nothing

2つの関数(GetClientsとGetDealersなど)がそれぞれ独自の接続を開いたり閉じたりすると、上記のように1つの接続を開いたり閉じたりするだけではなく、パフォーマンスに大きな影響がありますか?もしそうなら、どのようにコードをリファクタリングしますか?

4

6 に答える 6

5

私が間違っていなければ、接続はプールされているので、各関数が接続を開いたり閉じたりするのにほとんど費用がかからないはずです。

于 2009-06-03T20:45:50.470 に答える
1
  1. select * は使用せず、必要な列を指定してください。
  2. getrows を使用します
  3. データベースから取得したいものを指定します (join と where 句を使用します)。

これをすべて行うと、コードが最適になります。

于 2009-06-03T21:58:34.223 に答える
0

この場合、パフォーマンスの問題は発生しませんが、データ ソースが同じ場合は単一の接続を使用することをお勧めします。

これを行うためのより良い方法は、開いている単一の接続オブジェクトを GetClients および GetDealers 関数のそれぞれに渡すことです。

于 2009-06-03T20:47:32.947 に答える
0

接続は自動的にプールされるため、コストは非常に小さくなります。

ただし、ゼロではありません。プールから接続をプルして再度開くたびに、sp_reset_connection コマンドを SQL Server に送信します。これは非常に安いので、気にする必要はありません。

補足: 単一の ADODB.Connection は、複数のデータベース接続を表す場合があります。最初のレコードセットから読み取り中に同じレコードセットを使用して 2 番目のレコードセットを開こうとすると、バックグラウンドで新しいレコードセットが作成される可能性があります。繰り返しますが、これは本当の懸念事項ではなく、知っておくべきことです。

于 2009-06-03T20:53:22.997 に答える
0

接続をプールする必要があります

于 2009-06-05T13:26:37.000 に答える
0

クラシック ASP では接続プーリングを使用できます。そのコードをリファクタリングして、接続文字列を受け入れるメソッドを使用し、そのメソッド内でできるだけ早く接続を開いたり閉じたりします。

少なくとも接続の使用法と同じくらい懸念されるのは、切断されたレコードセット (ADO.NET が既定で実装する) を使用していないという事実です。切断されたレコードセットを使用すると、レコードセットを反復処理するまで待つのではなく、クエリを実行したらすぐに接続を閉じてプールに戻すことができます。

これを JScript で行う方法を次に示します。VBScript への移植は簡単です。

var sql = "select * from MyTable";
var cn = new ActiveXObject("ADODB.Connection");
var rs = new ActiveXObject("ADODB.Recordset");
var nothing = rs.ActiveConnection;
cn.Open(connectString);
rs.CursorLocation = 3; //adUseClient
rs.Open(sql, cn, 3, 1);
rs.ActiveConnection = nothing;
cn.Close();
//now do something with disconnected rs
于 2009-06-03T21:26:31.667 に答える