Laden...

DbConnection Timeout Problem (oder bug)???

Erstellt von pothead vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.661 Views
P
pothead Themenstarter:in
6 Beiträge seit 2006
vor 17 Jahren
DbConnection Timeout Problem (oder bug)???

Hallo ihr alle,

Ich stelle hier diese Frage in der Hoffnung, dass Jemand das selbe Prolblem auch schon mal hatte und mir weiterhelfen kann.
In einer Anwendung nutze ich ein Providerunabhängiges Modul zur Datenbankkommunikation mit einem SQL Express Ssrver mithilfe der Db... Klassen. Dieses Modul funktioniert eigentlich sehr zuvelässig.
Bei Test der Anwendung mit deaktivierter Netzwerkschnittstelle (um einen Ausfall des Servers zu Simulieren) ist mir aufgefallen, dass beim Versuch eine Verbindung herzustellen, die Funktion DbConnection.Open() nach einigen Versuchen (mal beim 2. mal, mal erst nach 20 versuchen oder gar nicht) das ConnectionTimeout nicht mehr abwartet, und SOFORT die Exception wirft, der Server wäre nicht zu erreichen. Schalte ich dann die LAN verbindung wieder an, meint die Methode Open() die Verbindung wäre nicht verfügbar. Manchmal "fängt" sich die DbConnection dann auch wieder und Verbindet nach einer undefinierten Anzahl von Versuchen dann doch wieder.
Der Stacktrace der Excetion zeigt mir, dass die Methode DbConnection.Open() irgendwann abbreicht.

Hier der StackTrace bei korrekter Funktionsweise:
(mit einigen Parameter der DbConnection, die ich mitgeloogt habe...)

2007-03-20 09:37:50,196-[DEBUG]-[DBCommunicator.DBCommunicator] Beginn des Verbindungsversuches (DbCommunicator.connectToDatabase). DbConnection.State: Closed
2007-03-20 09:38:10,875-> Fehlermeldung:

-[DBCommunicator.DBCommunicator] Fehler beim ýfnen der Datenbankverbindung (DbCommunicator):
System.Data.SqlClient.SqlException: Fehler beim Herstellen einer Verbindung mit dem Server. Beim Herstellen einer Verbindung mit SQL Server 2005 kann dieser Fehler dadurch verursacht werden, dass unter den SQL Server-Standardeinstellungen Remoteverbindungen nicht zulýsig sind. (provider: SQL-Netzwerkschnittstellen, error: 26 - Fehler beim Bestimmen des angegebenen Servers/der angegebenen Instanz)
bei System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
bei System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
bei System.Data.SqlClient.TdsParser.Connect(Boolean& useFailoverPartner, Boolean& failoverDemandDone, String host, String failoverPartner, String protocol, SqlInternalConnectionTds connHandler, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, SqlConnection owningObject, Boolean aliasLookup)
bei System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
bei System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
bei System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
bei System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
bei System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
bei System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
bei System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
bei System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
bei System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
bei System.Data.SqlClient.SqlConnection.Open()
bei DBCommunicator.DBCommunicator.connectToDatabase() in G:\E_NET\DBCommunicator\DBCommunicator.cs:Zeile 625.
2007-03-20 09:38:10,885-[DEBUG]-[DBCommunicator.DBCommunicator] DbConnection Verbindungsstatus: Closed[/size]

und nochmal bei inkorrekter Funktionsweise...

2007-03-20 09:44:59,283-[DEBUG]-[DBCommunicator.DBCommunicator] Beginn des Verbindungsversuches (DbCommunicator.connectToDatabase). DbConnection.State: Closed DbConnection.TimeOut: 20 2007-03-20 09:44:59,343-> _Fehlermeldung:_ -[DBCommunicator.DBCommunicator] Fehler beim ýfnen der Datenbankverbindung (DbCommunicator): > System.Data.SqlClient.SqlException: Fehler beim Herstellen einer Verbindung mit dem Server. Beim Herstellen einer Verbindung mit SQL Server 2005 kann dieser Fehler dadurch verursacht werden, dass unter den SQL Server-Standardeinstellungen Remoteverbindungen nicht zulýsig sind. (provider: SQL-Netzwerkschnittstellen, error: 26 - Fehler beim Bestimmen des angegebenen Servers/der angegebenen Instanz) > bei System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) > bei System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) > bei System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) > bei System.Data.SqlClient.SqlConnection.Open() > bei DBCommunicator.DBCommunicator.connectToDatabase() in G:\E_NET\DBCommunicator\DBCommunicator.cs:Zeile 625. > 2007-03-20 09:44:59,353-[DEBUG]-[DBCommunicator.DBCommunicator] DbConnection Verbindungsstatus: Closed[/size] > > > Ich hoffe jemand kann mir Helfen, dieses Problem treibt mich noch in den Wahnsinn.... > Danke schon mal im Voraus > > mfg - Pothead
T
512 Beiträge seit 2006
vor 17 Jahren

Hab Ähnliches auch schon beobachtet. Aber ich hab den Eindruck, das Timeout wird dann weggelassen, wenn die Netzwerkverbindung gerade aufgebaut wird.

Aber ich hab noch nicht festgestellt, dass das irgendwo Probleme verursacht. Das Fehlschlagen der Verbindung muss man einplanen, da spielt es doch dann auch keine Rolle mehr, wie schnell er fehlschlägt.

e.f.q.

Aus Falschem folgt Beliebiges

G
84 Beiträge seit 2007
vor 17 Jahren

Vielleicht liegt das an dem internen Connection Pool von ADO.NET.
Der sorgt nämlich dafür, dass u.U. eine DBConnection offen bleibt, obwohl man ein close() aufruft - wenn ich das richtig im Kopf habe.
Könnte sein, dass Dein Problem auch was damit zu tun hat...

P
pothead Themenstarter:in
6 Beiträge seit 2006
vor 17 Jahren

Leider passiert das nicht nur, wenn die Verbindung hergestellt wird, sondern auch wenn sie down ist und wenn sie schon wieder Verfügar ist.
Das Problem bei der Sache ist, dass wenn die Netzwerkverbindung wieder Verfügbar ist, das DbConnection Objekt keine Verbindung herstellt. (Oder erst nach dem 20. Aufruf der Funktion...)
"Timeout Problem ist vielleicht auch falsch ausgedrückt, da man am StackTrace erkennen kann, das die DbConnection in der Open Methode mittendrin abbricht, und gar nicht bis zum Ende der Aufrufkette kommt, zu dem sie im korrekten Zustand kommt.

P
pothead Themenstarter:in
6 Beiträge seit 2006
vor 17 Jahren

@gollum9

Danke für deine Anwort, sie hat mich auf den richtigen Weg gebracht.
Habe ConnectionPooling deaktiviert (is eh ne Singe Threaded Anwedung mit nur 1er Db Verbindung) und alles funktioniert wie erwarted.
Warum das aber mit ConnectionPooling nicht so funktoniert, ist mir allerdings ein Rätzel. Habe alles so gemacht wie in versch. Artikeln über ConnectionPooling beschrieben, und auch die Richtlinien von M$ eingehalten, aber immer das selbe Problem...

Na ja, auf jeden fall nich meins 😉

Danke und Ahoi

G
84 Beiträge seit 2007
vor 17 Jahren

Cool, freut mich 🙂

Wie deaktiviert man denn das Connection Pooling?

S
8.746 Beiträge seit 2005
vor 17 Jahren

Wie sieht denn der ConnectionString aus?

P
pothead Themenstarter:in
6 Beiträge seit 2006
vor 17 Jahren

Nachtrag:

Hatte die letzten Tage leider wenig Zeit - Aber hier die Antwort auf eure Fragen:
Connection Pooling deaktiviert man indem man dem ConnectionString Pooling=false hinzufügt. Standartmäßig ist ConnectionPooling mit 0 bis 100 Verbindungen eingestellt.
Man kann die Maximal- und Minimalanzahl der Verbindugen im ConnectionPool mit "Min Pool Size=x" und "Max Pool Size=y" begrenzen.
Habe es allerdings dann auch mit Pooling hinbekommen. Mein fehler war, dass ich Verbindungen, die bereits den Status "Closed" hatten, nach einer Exception nicht noch mal explizit mit DbConnection.Close() geschlossen hatte. Dadurch dachte das Framework die Verbindugen seien noch aktiv, und erst wenn der ConnectionPool "voll" ist (alle Verbindungen verwendet) überprüft dass das .Net FW und macht die inaktiven wieder verfügbar - sogar nach einem Fehlgeschlagenem DbConnection.Open() muss man hinterher .Close() aufrufen... ?( (wer soll darauf schon kommen, zumal in den meisten Büchern im Kapitel ADO.NET nicht so genau drauf eingegangen wird. 🙁