Frage

Wir haben eine Reihe von VB6-Anwendungen in unserem Unternehmen. Wir versuchen, einen zufälligen SQL Timeout-Fehler zu debuggen und haben eine Spur mit SQL Server Profiler auf dem Audit Login-Ereignisse. Wir haben festgestellt, dass die Verbindungen in als nicht im Pool befindlichen kamen. Wir verwenden den OLE DB-Provider mit SQL Server 2000 und 2005. Ich suchte im Internet und alles, was ich über so kommen, dass Verbindungen standardmäßig in der OLE DB-Provider vereinigt werden, aber wir sind nicht zu sehen. Unten ist der Code, den wir mit der Datenbank verbinden. Wir müssen wirklich diese Verbindungen haben gepoolt, weil wir glauben, dass dies das Problem mit unserem zufälligen Timeout-Fehler sein kann. Könnte jemand etwas Licht leuchten auf, warum Verbindungspooling nicht funktioniert und jede mögliche Weise, es funktioniert? Danke.

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
War es hilfreich?

Lösung

Anordnen die Verbindung bei jedem Aufruf verhindern könnte Pooling

  

... mindestens eine Instanz einer Verbindung   Objekt für jede einzelne instanziiert   Benutzer zu allen Zeiten. Ansonsten ist der Pool   wird zerstört, wenn die letzte   Connection-Objekt für diesen String   geschlossen.

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

Andere Tipps

Ich verwirrte herum und öffnete eine Verbindung an app Start und hielt es die ganze Zeit geöffnet durch die App ausgeführt wurde. Connection Pooling hat nach der zweiten geöffneten und geschlossenen Verbindung starten.

Sie haben erwähnt, dass Sie ein zufälliges Timeout Problem auf der Spur versuchen. Ich habe das gleiche hat, in der Regel, wenn ich eine SELECT tat, das eine Menge von Zeilen zurückgegeben. Zwei Dinge:

Cnn.CursorLocation = ADODB.adUseServer

(Die andere Option ist adUseClient) - Ich glaube, adUseServer gab mir schnelle Abfragen, die die Wahrscheinlichkeit von Timeouts reduziert. Sie tun dies, bevor Sie die Verbindung öffnen, glaube ich.

Cnn.CommandTimeout = 0

Auch vor dem open (), sagt es, dass Sie eine unendliche Timeout wollen. Ich denke, das Standard-Timeout so etwas wie 30s ist, das für einige Abfragen viel zu kurz war. Das Command für Cord-Abfragen verwendet werden. Wenn Sie ein Command-Objekt verwenden, es hat seine eigene Command Mitglied, das scheint nicht von der Verbindung zu erben (dh, habe ich es, bevor ich einen Befehl ausführen).

Sorry, wenn die Syntax nicht ganz richtig ist, ich von einigem C ++ Code bin zu schneiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top