PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

JDBC:Kann ich eine Verbindung in einer Multithreading-App teilen und schöne Transaktionen genießen?

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 zeitlich einteilt (ungeachtet der Definition Ihrer eigenen kritischen Abschnitte), sodass Sie versehentlich mehrere Threads haben könnten, die versuchen, Daten über diese eine Pipe zu senden.

Beachten Sie, dass dies auch für alle Netzwerkkommunikationen gilt. Wenn Sie beispielsweise zwei Threads hatten, die versuchten, einen Socket mit einer HTTP-Verbindung zu teilen.

  • Thread 1 stellt eine Anfrage
  • Thread 2 stellt eine Anfrage
  • Thread 1 liest Bytes aus dem Socket und liest unabsichtlich die Antwort von der Anfrage von Thread 2

Wenn Sie alle Ihre Transaktionen in kritische Abschnitte verpackt haben und daher alle anderen Threads für einen gesamten Begin/Commit-Zyklus gesperrt haben, können Sie möglicherweise eine Datenbankverbindung zwischen Threads teilen. Aber selbst dann würde ich das nicht tun, es sei denn, Sie haben wirklich angeborene Kenntnisse des JDBC-Protokolls.

Wenn die meisten Ihrer Threads Datenbankverbindungen selten (oder überhaupt nicht) benötigen, können Sie möglicherweise einen Thread für Ihre Datenbankarbeit bestimmen und andere Threads ihre Anforderungen an diesen einen Thread in die 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 eine andere spezielle Frage dazu auf StackOverflow stellen).

Aktualisierung: Um Ihre Frage im Kommentar zu beantworten, unterstützen die meisten Datenbankmarken nicht mehrere gleichzeitige Transaktionen auf einer einzigen Verbindung (InterBase/Firebird ist die einzige mir bekannte Ausnahme).

Es wäre schön, ein separates Transaktionsobjekt zu haben und mehrere Transaktionen pro Verbindung starten und festschreiben zu können. Aber Anbieter unterstützen es einfach nicht.

Ebenso gehen herstellerunabhängige Standard-APIs wie JDBC und ODBC von der gleichen Annahme aus, dass der Transaktionsstatus lediglich eine Eigenschaft des Verbindungsobjekts ist.