PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

JDBC:Posso condividere una connessione in un'app multithreading e godermi piacevoli transazioni?

Sì, in generale è necessario creare una nuova connessione per ogni thread. Non hai il controllo sul modo in cui il sistema operativo esegue la sequenza temporale dell'esecuzione dei thread (nonostante la definizione delle tue sezioni critiche), quindi potresti inavvertitamente avere più thread che tentano di inviare dati lungo quella pipe.

Si noti che lo stesso vale per qualsiasi comunicazione di rete. Ad esempio, se avevi due thread che tentavano di condividere un socket con una connessione HTTP.

  • Il thread 1 fa una richiesta
  • Il thread 2 fa una richiesta
  • Il thread 1 legge i byte dal socket, leggendo inconsapevolmente la risposta dalla richiesta del thread 2

Se hai racchiuso tutte le tue transazioni in sezioni critiche e quindi hai bloccato qualsiasi altro thread per un intero ciclo di inizio/commit, potresti essere in grado di condividere una connessione al database tra i thread. Ma non lo farei nemmeno allora, a meno che tu non abbia davvero una conoscenza innata del protocollo JDBC.

Se la maggior parte dei tuoi thread ha bisogno raramente di connessioni al database (o non ne ha affatto bisogno), potresti essere in grado di designare un thread per eseguire il lavoro del tuo database e fare in modo che altri thread accodino le loro richieste a quel thread. Ciò ridurrebbe il sovraccarico di così tante connessioni. Ma dovrai capire come gestire le connessioni per thread nel tuo ambiente (o fare un'altra domanda specifica su StackOverflow).

aggiornamento: Per rispondere alla tua domanda nel commento, la maggior parte dei marchi di database non supporta più transazioni simultanee su una singola connessione (InterBase/Firebird è l'unica eccezione che conosco).

Sarebbe bello avere un oggetto transazione separato e poter avviare e eseguire il commit di più transazioni per connessione. Ma i fornitori semplicemente non lo supportano.

Allo stesso modo, le API standard indipendenti dal fornitore come JDBC e ODBC presuppongono lo stesso che lo stato della transazione sia semplicemente una proprietà dell'oggetto connessione.