Posts: 60
Threads: 17
Joined: Jul 2011
Reputation:
0
Hallo ASG Support Team,
seit ich auf Patch 5 umgestellt habe, stürzt bei mir die Datenbankverbindung nach kurzer Zeit ab.
Ein dadurch entstandenes Problem ist dann, dass die Fehlermeldung oft hinter der Hauptanwendung liegt und sich deswegen nicht wegklicken lässt.
Dann ist die Toolbar und die Navigation blockiert.
Das ist echt nervig, weil es massiv Zeit kostet.
Markus
Posts: 11,127
Threads: 100
Joined: Aug 2006
Reputation:
202
Was heisst "die Datenbankverbindung stürzt ab"? Wann genau, welche Fehlermeldung?
Regards/Gruss
Oliver
Posts: 60
Threads: 17
Joined: Jul 2011
Reputation:
0
(24-10-2019, 10:51 AM)DevOma Wrote: Was heisst "die Datenbankverbindung stürzt ab"? Wann genau, welche Fehlermeldung?
Hallo Oliver,
sorry für die extrem später Rückmeldung.
Die Fehler treten im Hinbtergrund auf, während man arbeitet.
Im Log habe ich immer folgende Meldung:
Code: An error occured on executing an sql statement
PropertiesGet
Internal connection fatal error. Error state: 15, Token : 51
---------------------------
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader()
at CloudAdminDataAccess.SqlDataAccessor._PropertiesGet(Guid userId, Guid itemId, Guid rolePropertyId)
Wir nutzen eine Shared Database. Die Installation ist in der Form schon ein paar Jahre her.
Gegen die aktuelle Datenbank haben wir mit folgenden Versionen getestet:
- 12.0.6504.1 (permanente Probleme, mehr als 8 pro Stunde)
- 12.0.6342.1 (gelegentliche Probleme)
- 11.0.6169.1 (keine Probleme)
- 10.1.5629.1 (keine Probleme)
Viele Grüße
Markus
Posts: 11,127
Threads: 100
Joined: Aug 2006
Reputation:
202
Bitte mal den "Data-Optimizer" laufen lassen - die ersten 3 Bereiche wären wichtig - vielleicht können so die fehlerhaften Daten gefunden und gelöscht werden?!?
Regards/Gruss
Oliver
Posts: 60
Threads: 17
Joined: Jul 2011
Reputation:
0
Habe ich gemacht:
zu 1.) nichts gefunden
zu 2.) 1 Objekt entfernt
zu 3.) 19 Properties und 4 Property Usages entfernt
zu 4.) nichts gefunden
zu 5.) 273 Vererbungsoptimierungen
zu 6.) 270 Merged
Könnte echt mit Punkt 3. zusammenhängen.
Ich beobachte jetzt mal das Verhalten.
Vielen Dank, für die schnelle Hilfe.
Markus
Posts: 60
Threads: 17
Joined: Jul 2011
Reputation:
0
Hallo zusammen,
wir haben den Data Optimizer mit allen Optionen laufen lassen.
Leider kommt es immer noch regelmäßig zu Problemen.
In den meisten der Fälle ist es die erwähnte Exception.
Ein Seiteneffekt ist außerdem noch, dass dann die Pfad Spalte in der Suche leer ist und nur dann wieder Daten enthält,
wenn man das Layout zurücksetzt und damit die Anwendung neu startet.
Aktuell wird durch das Problem die Anwendung immer unbrauchbarer!
Bitte findet eine Lösung.
Danke
Markus
Posts: 60
Threads: 17
Joined: Jul 2011
Reputation:
0
I also must add, when I had a look in the message log, that there are always two errors at the same time.
Maybe the real error has to do with reusing a closed connection (Garbage Collectore cleanup?):
Code: An error occured on executing an sql statement
PropertiesGet
Invalid operation. The connection is closed.
---------------------------
at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
at System.Data.SqlClient.TdsParserStateObject.TryReadByteArray(Byte[] buff, Int32 offset, Int32 len, Int32& totalRead)
at System.Data.SqlClient.TdsParser.TrySkipValue(SqlMetaDataPriv md, Int32 columnOrdinal, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.TrySkipRow(_SqlMetaDataSet columns, Int32 startCol, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.TrySkipRow(_SqlMetaDataSet columns, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.DrainData(TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command)
at System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command)
at System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader()
at CloudAdminDataAccess.SqlDataAccessor._PropertiesGet(Guid userId, Guid itemId, Guid rolePropertyId)
Markus
Posts: 60
Threads: 17
Joined: Jul 2011
Reputation:
0
Je mehr ich mir das Log anschaue, desto mehr bin ich der Überzeugung, dass unsauber programmiert wurde:
Code: An error occured on executing an sql statement
PropertiesGet
There is already an open DataReader associated with this Command which must be closed first.
---------------------------
at System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command)
at System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command)
at System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader()
at CloudAdminDataAccess.SqlDataAccessor._PropertiesGet(Guid userId, Guid itemId, Guid rolePropertyId)
Diese Melde besagt, dass eine Instanz der SqlCommand Klasse nicht sauber mittels Dispose aufgeräumt wurde und noch mit der SQL Verbindung verknüpft ist.
Diese wurde scheinbar auch nicht released (Dispose) und wurde wiederverwendet.
Ich will mich hier nicht aufspielen, aber normalerweise lernt man, dass man bei .NET/Java etc. try-finally Blöcke genau dafür verwenden soll!
Markus
Posts: 11,127
Threads: 100
Joined: Aug 2006
Reputation:
202
Ist es halt in einer grossen Anwendung nicht ganz so einfach - aber wir werden nochmal schauen ob wir etwas herausfinden...
Regards/Gruss
Oliver
Posts: 60
Threads: 17
Joined: Jul 2011
Reputation:
0
(27-12-2019, 02:38 PM)DevOma Wrote: Ist es halt in einer grossen Anwendung nicht ganz so einfach - aber wir werden nochmal schauen ob wir etwas herausfinden...
Danke.
Mich wundert es nur, dass nicht alle diese Probleme haben.
Posts: 11,127
Threads: 100
Joined: Aug 2006
Reputation:
202
Wenn es alle hätten, wäre das Problem wohl auch leicht zu finden - das Blöde ist, das wir es nicht nachstellen können und das macht es schwierig...
Regards/Gruss
Oliver
Posts: 60
Threads: 17
Joined: Jul 2011
Reputation:
0
(02-01-2020, 11:53 AM)DevOma Wrote: Wenn es alle hätten, wäre das Problem wohl auch leicht zu finden - das Blöde ist, das wir es nicht nachstellen können und das macht es schwierig...
Damit ihr es nicht so schwierig habt, habe ich mir mal die Mühe gemacht und mir euer Programm von Source Code Seite her angeschaut,
vor allem die Klasse CloudAdminDataAccess.SqlDataAccessor, die in den Fehlermeldungen auftaucht.
Es wird nur eine Instanz von SqlConnection verwendet, aber nicht sichergestellt, dass auf der Klasse immer nur ein Thread gleichzeitig Methoden aufrufen kann. - Warum werden nicht mehrere SqlConnection Instanzen verwendet? ADO.NET nutzt Pooling, um Verbindungen schnell wieder zuverwenden.
- Wenn ein SqlDataReader angefragt hat, meldet die SqlConnection trotzdem den Status Open, was dazu führt, dass die SqlConnection wiederverwendet wird, obwohl diese noch in Verwendung ist.
- Es scheint, als ob diese Single Instanz Variante als Notlösung wg. der Transaction Unterstützung gemacht worden wäre.
Wenn dem so ist, wäre es sinnvoller, eventuell alles anders mit Unterstützung der TransactionScope Klasse zu implementieren
Außerdem sehe ich Probleme in der Methode StartTransaction (nicht für mein Problem verantwortlich): - Es wird nicht geprüft, ob eine Connection existiert (not null), bevor m_Connection.BeginTransaction() aufgerufen wird
- Im Fehlerfall bleibt die Variable m_ActiveTransaction auf true, obwohl keine Transaction vorliegt
Viele Grüße
Markus
Posts: 11,127
Threads: 100
Joined: Aug 2006
Reputation:
202
Vielen Dank für die Code-Analyse :-)
Es gibt weitere Gründe warum es so implementiert ist, wie es ist - aber eine öffentliche Diskussion über den Code möchten wir hier nicht führen.
Wir werden es uns anschauen und ggf. optimieren :-)
Regards/Gruss
Oliver
Posts: 11,127
Threads: 100
Joined: Aug 2006
Reputation:
202
Zum eigentlich Problem - wir haben anscheinend die Fehlerursache gefunden - und zwar beim "Automatischen Refresh des Cache" - diese Einstellung ist unter den Einstellungen=>Applikation zu finden - bitte mal auf 0 setzen, damit kein automatischer Refresh ausgeführt wird - BugFix gibt es mit der nächsten Version...
Regards/Gruss
Oliver
|