Il thread MySQL Connector / JDBC è sicuro?
-
06-07-2019 - |
Domanda
Il driver standard MySQL JDBC è sicuro per i thread? In particolare, voglio utilizzare una singola connessione tra tutti i thread, ma ogni istruzione verrà utilizzata solo in un singolo thread. Ci sono alcuni scenari sicuri e altri no? Qual è la tua esperienza qui?
Soluzione
Le transazioni vengono avviate / impegnate per connessione. A meno che tu non stia facendo alcune cose molto specifiche (non riesco davvero a pensare a un esempio in cui ciò sarebbe giustificato per essere onesto), stai meglio con un pool di connessioni e una connessione per thread.
Altri suggerimenti
Se autocommit = 1, è molto fattibile che più thread condividano la stessa connessione, a condizione che l'accesso alla connessione sia sincronizzato. Se autocommit = 0, dovrai controllare l'accesso alla connessione tramite una sorta di mutex finché non si verifica il commit.
A meno che tu non sia assolutamente limitato nella quantità di connessioni che la tua applicazione può avere, un pool di connessioni potrebbe essere un'alternativa più praticabile.
In base alla mia recente esperienza, l'oggetto Connection
non è thread-safe in Connector / J 5.1.33.
Ho riscontrato una situazione di deadlock descritta in bug 67760 . Non sono sicuro che si tratti di un bug, ma un consiglio ragionevole della discussione è stato:
[12 dic 2012 20:33] Todd Farmer
Non utilizzare un singolo oggetto Connessione su più thread senza una corretta sincronizzazione. Connettore / J - e, soprattutto, il protocollo client-server MySQL - non consente la concorrenza operazioni che utilizzano lo stesso oggetto Connessione. Se un oggetto Connessione deve essere condiviso tra i thread, è responsabilità del autore del codice dell'applicazione per garantire che le operazioni siano serializzate correttamente.