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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top