4

社内には VB6 アプリがたくさんあります。ランダムな SQL タイムアウト エラーをデバッグしようとしており、Audit Login イベントで SQL Server Profiler を使用してトレースを行いました。接続が非プールとして入っていることに気付きました。SQL Server 2000 および 2005 で SQLOLEDB プロバイダーを使用しています。インターネットを検索したところ、SQLOLEDB プロバイダーではデフォルトで接続がプールされていることがわかりましたが、これは表示されません。以下は、データベースへの接続に使用するコードです。これがランダム タイムアウト エラーの問題である可能性があるため、これらの接続をプールする必要があります。接続プーリングが機能しない理由と、それを機能させる方法について、誰かが光を当てることができますか? ありがとう。

Dim cnn As New ADODB.Connection
cnn.ConnectionString = "Provider=SQLOLEDB;Data Source=xxx;Catalog=xxx;User ID=xxx Password=xxx;"
Call cnn.Open
Dim cmd As New ADODB.Command
Set cmd.ActiveConnection = cnn
cmd.CommandText = "SELECT * FROM [Table]"
Dim rs As New ADODB.RecordSet
Call rs.Open(cmd, , adOpenStatic, adLockOptimistic)
While Not rs.eof
    'Do stuff
    Call rs.MoveNext
Wend
'Close and Dispose connection here
4

3 に答える 3

5

すべての呼び出しで接続を破棄すると、プーリングを防ぐことができます

...一意のユーザーごとにインスタンス化された Connection オブジェクトの少なくとも 1 つのインスタンスが常に存在します。そうしないと、その文字列の最後の Connection オブジェクトが閉じられたときに、プールが破棄されます。

http://msdn.microsoft.com/en-us/library/ms810829.aspx

于 2009-01-09T13:29:25.540 に答える
0

ランダムタイムアウトの問題を追跡しようとしているとのことですが。私は同じことをしました。一般的に、多くの行を返すSELECTを実行していたときです。2つのこと:

Cnn.CursorLocation=ADODB.adUseServer

(もう1つのオプションはadUseClient)-adUseServerクエリが高速化され、タイムアウトの可能性が減ったと思います。接続を開く前にこれを行うと私は信じています。

Cnn.CommandTimeout=0

また、の前にopen()、無限のタイムアウトが必要であることを通知します。デフォルトのタイムアウトは30秒のようなものだと思いますが、これは一部のクエリには短すぎました。クエリCommandTimeoutに使用されます。Recordsetオブジェクトを使用する場合、そのCommandオブジェクトには独自のCommandTimeoutメンバーがあり、接続から継承しているようには見えません(つまり、コマンドを実行する前に設定しました)。

構文が正しくない場合は申し訳ありませんが、C++コードから切り取っています。

于 2009-01-09T19:40:00.657 に答える
0

私はいじって、アプリの起動時に接続を開き、アプリの実行中ずっと開いたままにしました. 接続プーリングは、2 回目の接続を開いて閉じた後に開始されました。

于 2009-01-09T19:04:53.130 に答える