Ja, im Allgemeinen müssen Sie für jeden Thread eine neue Verbindung erstellen. Sie haben keine Kontrolle darüber, wie das Betriebssystem die Ausführung von Threads verzögert (ungeachtet der Definition Ihrer eigenen kritischen Abschnitte), sodass Sie versehentlich mehrere Threads verwenden könnten, die versuchen, Daten über diese eine Pipe zu senden.
Beachten Sie das Gleiche gilt für jede Netzwerkkommunikation. Wenn Sie beispielsweise zwei Threads hatten, die versuchten, einen Socket mit einer HTTP-Verbindung zu teilen.
- Thread 1 stellt eine Anfrage
- Thread 2 eine Anforderung
- Thread 1 liest Bytes aus der Steckdose, ohne es zu wissen die Antwort vom Wunsch des Gewindes 2 Lesen
Wenn Sie alle Ihre Transaktionen eingewickelt In kritischen Abschnitten sperren Sie daher alle anderen Threads für einen gesamten Begin/Commit-Zyklus. Dann können Sie möglicherweise eine Datenbankverbindung zwischen Threads freigeben. Aber ich würde das auch dann nicht tun, wenn Sie nicht wirklich das JDBC-Protokoll beherrschen.
Wenn die meisten Ihrer Threads nur selten Datenbankverbindungen benötigen (oder gar nicht), können Sie möglicherweise einen Thread für Ihre Datenbankarbeit festlegen und andere Threads ihre Anforderungen an diesen einen Thread in Warteschlange stellen lassen. Das würde den Overhead von so vielen Verbindungen reduzieren. Aber Sie müssen herausfinden, wie Sie Verbindungen pro Thread in Ihrer Umgebung verwalten (oder stellen Sie eine andere spezifische Frage dazu in StackOverflow).
update: Um Ihre Frage in dem Kommentar zu beantworten, unterstützen die meisten Datenbankmarken nicht mehrere gleichzeitige Transaktionen auf einer einzigen Verbindung (InterBase/Firebird ist die einzige Ausnahme, die ich kenne).
Es wäre nett, ein separates Transaktionsobjekt zu haben und mehrere Transaktionen pro Verbindung zu starten und zu committen. Aber Verkäufer unterstützen es einfach nicht.
Ebenso machen herstellerunabhängige APIs wie JDBC und ODBC die gleiche Annahme, dass der Transaktionszustand lediglich eine Eigenschaft des Verbindungsobjekts ist.
Ok ... Nur aus Neugier, haben Sie eine Vorstellung davon, warum die Definition der Transaktion mit der Definition der Verbindung auf JDBC verbunden ist? Ich würde ein Transaktionsobjekt wirklich schätzen. – fulmicoton
Vielen Dank für Ihre Antwort !!! – fulmicoton
Die Aussage "Sie könnten unbeabsichtigt mehrere Threads haben, die versuchen, Daten nach unten zu schicken" in dieser Antwort ist definitiv falsch für postgresql. Siehe http://doc.postgresintl.com/jdbc/ch10.html. Die Verbindung ist zumindest Thread-sicher, wenn auch nicht vollständig parallelisiert, wie es sein könnte. –