Domanda

Per riformulare la domanda: dovrei evitare di condividere le istanze di classi che implementano java.sql.Connection tra i diversi fili

?
È stato utile?

Soluzione

Se il driver JDBC è spec-compliant, quindi tecnicamente sì, l'oggetto è thread-safe, ma si dovrebbe evitare di condivisione delle connessioni tra le discussioni, in quanto l'attività sulla connessione significherà che solo un thread sarà in grado di fare qualsiasi cosa alla volta.

È necessario utilizzare un pool di connessione (come Apache Commons DBCP ) per garantire che ciascun filo ha la propria connessione.

Altri suggerimenti

java.sql.Connection è un'interfaccia. Quindi, tutto dipende sull'attuazione del conducente, ma in generale si dovrebbe evitare di condividere la stessa connessione tra i diversi thread e pool di connessioni uso. Inoltre è anche consigliato di avere il numero di connessioni nel pool superiore il numero di thread di lavoro.

Questo è piuttosto un vecchio thread, ma per coloro che sono alla ricerca di una risposta per quanto riguarda Microsoft SQL Server, ecco la risposta:

  

SQLServerConnection non è thread sicuro, tuttavia più istruzioni create da una singola connessione può essere elaborando contemporaneamente in thread simultanei.

e

  

SQLServerConnection implementa una connessione JDBC per SQL Server.

Da tutto quanto sopra esposto, è possibile condividere le dichiarazioni, ma non Connessioni, e nel caso in cui hai bisogno di una connessione in ogni thread, è possibile utilizzare un pool di thread.

Per saperne di più qui

JDBC e documenti multithreading :

  

Poiché tutti i metodi API JDBC Oracle sono sincronizzati, se due thread tentano di utilizzare l'oggetto di connessione contemporaneamente, allora sarà costretto ad attendere l'altro termina il suo uso.

Così può essere sicuro in caso di Oracle, ma l'accesso concorrente avrebbe sofferto da collo di bottiglia.

Abbiamo avuto ArrayOutOfBoundsException sulla cache dichiarazione Websphere della sua PooledDataSource, e abbiamo dovuto disattivare quella cache.

Abbiamo avuto un trattamento che si bloccava.

Tutto questo a causa di accesso corrente alla connessione, quindi la conclusione, da vera e propria pratica di vita, è che non è necessario farlo.

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