データベースを別のサーバーに移動した後、複数の SELECT を実行すると、タイムアウトの問題に直面しています。パッチを適用する任務を負っていた遺物 (VB6 アプリケーション) です。古い環境では問題なく動作しましたが、新しい環境には古いテーブルのカーボンコピーが含まれています。
ノート!新しいデータベースはゼロから構築されました(つまり、DBA は多くの CREATE TABLE + INSERT スクリプトを実行してテーブルのカーボン コピーを作成し、それらに古いデータを入力しました)。
これはエラーソースです:
// "conn" is being initialized outside the function
Public Function PerformOperation(ByRef conn as ADODB.Connection, query as string) as Boolean
Dim rs as ADODB.Recordset
//This below is the timeout source
rs.Open conn, query, adOpenStatic, adLockReadOnly
If Not (rs.EOF or rs.BOF) Then
rs.MoveFirst
//assign data to many variables
End If
ExitPoint:
If Not (rs Is Nothing) Then
If (rs.State = adStateOpen) Then rs.Close
Set rs = Nothing
End If
Exit Function
Error:
MsgBox "Blah blah"
Resume ExitPoint
Resume 0
End Function
関数はこのように呼び出されます
conn = New ADODB.Connection
conn.ConnectionString = "..."
conn.Open
For i = 1 To RowCount //reading data from a grid component (data is correct!)
//very long select here... kept short
query = "SELECT something FROM somewhere WHERE <manyFields> = <manyValues>"
If PerformOperation(conn, query) = True Then
//UPDATE another table based on the SELECT data
// NOTE: this occurs on a DIFFERENT, INDEPENDENT ADODB.Connection object
End If
Next i
1回目PerformOperation
は問題なく呼び出され、2回目は設定に関係なくタイムアウトしCommandTimeout
ます。サイクルが1回「循環」する場合も問題なく動作します。
ここでの大きな問題は、試してみる必要があるのは実稼働環境だけなので、特に注意する必要があることです。また、DBA に関する深い知識も手元にありません...非常に古いソフトウェアであり、最終的に .NET に移植される予定ですが、その間に対処する必要があります...
この問題を確認または修正するにはどうすればよいですか? これはFor
、サイクルのどの長さでも機能する必要があります
提案に感謝します(いつものように、重要な詳細を見逃した場合は指摘してください。できれば提供します)。
編集 #1 何が起こっているかについての詳細を提供するために、最初と 2 番目のコード ブロックを拡張しました。強調表示を修正するためにコメントが変更されました (単一引用符は色付けを台無しにします)。
編集 #2 接続文字列で複数のアクティブな結果セット (MARS) を有効にしても、どちらも役に立ちませんでした。