Ich verwende Transaction Binding=Explicit Unbind
in der Verbindungszeichenfolge wie empfohlen here, da ich auch TransactionScope mit Timeout verwenden. Das Problem besteht darin, dass die Verbindungen nach der Entsorgung nicht geschlossen werden und schließlich keine Verbindungen mehr im Verbindungspool verfügbar sind. Ich habe das gleiche Ergebnis, wenn ich die TransactionTimeoutIssueDemo geändert (siehe Link) und lief TransactionScopeTest() (mit der ausdrücklichen unbind Connection String) oft genug in einer Schleife alle verfügbaren Verbindungen im Verbindungspool aufbrauchen. Der Standardwert für Verbindungen im Pool ist 100, dies kann jedoch geändert werden, indem beispielsweise die Einstellung verwendet wird. Es scheint, dass die Verbindungen nicht freigegeben werden, wenn die explizite Aufhebung der Bindung verwendet wird, obwohl sowohl SqlConnection als auch TransactionScope mit der Klausel using
verwendet werden. Wer weiß, wie man damit umgeht?Verbindungen werden nicht geschlossen, wenn Transaction Binding = Explicit Unbind verwendet wird; In Verbindungszeichenfolge
Antwort
Die Verbindungen scheinen nur im Pool zu bleiben und werden nicht wiederverwendet, falls Sie wie im Beispiel eine Ausnahme erhalten. Wenn Sie das Zeitlimit erhöhen, wird die Verbindung wiederverwendet.
Eine Abhilfe für dieses Problem ist die Verbindung Pool im Fall löschen Sie eine Ausnahme wie diese:
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
try
{
Console.WriteLine("Server is {0}", con.ServerVersion);
Console.WriteLine("Clr is {0}", Environment.Version);
for (int i = 0; i < 5; i++)
{
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = "insert into TXTEST values (" + i + ")";
cmd.ExecuteNonQuery();
}
Console.WriteLine("Row inserted");
}
Thread.Sleep(TimeSpan.FromSeconds(1));
}
catch
{
SqlConnection.ClearPool(con);
throw;
}
}
In den meisten Fällen wird die Transaktion innerhalb der Timeout abgeschlossen wird und alles wird schön und gut sein. Wenn die Transaktion Timeout tatsächlich tun löschen Sie den Pool, um die schmutzigen Verbindungen zu bereinigen, die nicht wiederverwendet bekommen. Dies wirkt sich natürlich auf andere Verbindungen im Pool aus, die nicht von diesem Problem betroffen sind.
Dies ist ein hässlicher Workaround, aber es scheint zu funktionieren.
Für was es wert ist, wurde dieses Problem in .NET 4.0 behoben.
- 1. Existierende Verbindung wird geschlossen, wenn neue TCP-Verbindungen hergestellt werden
- 2. restheart - Verbindungen nicht geschlossen
- 3. Wie können EntityManager-Verbindungen ordnungsgemäß geschlossen werden?
- 4. Binding Update = Explicit, Updates Quelle beim Programmstart
- 5. Wie wird eine pconnect() - Verbindung geschlossen oder zurückgesetzt, wenn PHPRedis und PHP-FPM verwendet werden?
- 6. Wrap Transaction Inside Using-- Muss es manuell geschlossen werden?
- 7. Was passiert, wenn Verbindungen zu MongoDB nicht geschlossen sind?
- 8. GESCHLOSSEN Verbindungsprobleme mit JPA-Transaction-Manager
- 9. C# MySqlConnection wird nicht geschlossen
- 10. Wie stellt man in MongoDB sicher, dass alle Verbindungen geschlossen werden, wenn close() manchmal nicht aufgerufen wird?
- 11. Android: Dienst stoppt, wenn Aktivität geschlossen wird
- 12. WCF TCP-Verbindungen bleiben offen, wenn der Prozess beendet wird
- 13. AlarmManager funktioniert nicht, wenn App geschlossen wird
- 14. Die "Not Found" Verhalten von Laravel des Routing "Explicit Binding"
- 15. Sollten clojure core.async-Kanäle geschlossen werden, wenn sie nicht mehr verwendet werden?
- 16. ComboPooledDataSource verwendet die Verbindungen nicht erneut
- 17. Müssen Datenbankverbindungen geschlossen werden?
- 18. Wie verfolge ich verwaiste JDBC-Verbindungen, die nicht geschlossen sind?
- 19. Nested Transaction nicht in Tests
- 20. unbind ('click') funktioniert nicht
- 21. Neo4j Datenbank wird gesperrt, wenn die Transaktion nicht geschlossen wird
- 22. "__globals__" wird zusammengeführt, wenn Dekoratoren verwendet werden?
- 23. Werden die Threads angehalten, wenn die Anwendung geschlossen wird?
- 24. Datei kann nicht gefunden werden, wenn RecursiveDirectoryIterator verwendet wird
- 25. Was passiert mit einer nicht festgeschriebenen Transaktion, wenn die Verbindung geschlossen wird?
- 26. Skript kann nicht geladen werden, wenn wp_enqueue_script verwendet wird
- 27. Das ZF2-Formular wird nicht validiert, wenn Feldsätze verwendet werden.
- 28. Azure Storage CloudBlob.Properties werden nicht initialisiert, wenn GetBlobReference() verwendet wird
- 29. Dropdown-Liste kann nicht deaktiviert werden, wenn Bootstrap verwendet wird
- 30. Was wird "neu" verwendet, wenn eine Laufzeitbibliothek nicht verwendet wird?