Domanda

La specifica JDBC 3.0 parla del pool di connessioni (e istruzioni preparate).

Abbiamo diversi programmi Java autonomi (ovvero non stiamo usando un server applicazioni) che hanno utilizzato DBCP per fornire il pool di connessioni. Dovremmo continuare a utilizzare DBCP o possiamo trarre vantaggio dal pooling fornito da JDBC e sbarazzarci di DBCP?

Stiamo usando MySQL (Connettore / J) e alla fine aggiungeremo il supporto per SQL Server (jTDS); è improbabile che supporteremo qualsiasi altro database.

EDIT: vedi il commento qui sotto sul mio tentativo di eliminare la libreria del pool di connessioni. Sembra che DBCP sia ancora rilevante (si noti che alcuni commentatori hanno raccomandato C3P0 su DBCP).

È stato utile?

Soluzione

Sulla base dell'incoraggiamento di altri poster, ho tentato di eliminare DBCP e utilizzare direttamente il driver MySQL JDBC (Connector / J 5.0.4). Non sono stato in grado di farlo.

Sembra che mentre il driver fornisce una base per il pooling, non fornisce la cosa più importante: un pool reale (il codice sorgente è stato utile per questo). È lasciato al server delle applicazioni fornire questa parte.

Ho dato un'altra occhiata alla documentazione di JDBC 3.0 (ho una copia stampata di qualcosa etichettato " Capitolo 11 Pool di connessioni " non so esattamente da dove provenga) e vedo che il Il driver MySQL sta seguendo il documento JDBC.

Quando guardo DBCP, questa decisione inizia a dare un senso. Una buona gestione del pool offre molte opzioni. Ad esempio, quando si elimina la connessione non utilizzata? quali connessioni si eliminano? esiste un limite rigido o soft sul numero massimo di connessioni nel pool? dovresti testare una connessione per " liveness " prima di darlo a un chiamante? ecc.

Riepilogo: se si sta eseguendo un'applicazione Java autonoma, è necessario utilizzare una libreria di pool di connessioni. Le librerie del pool di connessioni sono ancora pertinenti.

Altri suggerimenti

DBCP presenta gravi difetti. Non credo sia appropriato per un'applicazione di produzione, specialmente quando così tanti driver supportano il pooling nei loro DataSource nativamente.

La goccia che ha spezzato la schiena del cammello, nel mio caso, è stata quando ho scoperto che l'intero pool è stato bloccato per tutto il tempo in cui è stato effettuato un nuovo tentativo di connessione al database. Quindi, se succede qualcosa al tuo database che provoca connessioni lente o timeout, altri thread vengono bloccati quando provano a restituire una connessione al pool & # 8212; anche se vengono fatti usando un database.

I pool hanno lo scopo di migliorare le prestazioni, non di degradarle. DBCP è ingenuo, complicato e obsoleto.

Preferisco usare dbcp o c3p0 perché sono neutri rispetto al fornitore. Ho scoperto, almeno con mysql o oracle, che ogni volta che provo a fare qualcosa con il client jdbc che non è sql standard devo introdurre la dipendenza in fase di compilazione dalle classi del fornitore. Vedi, ad esempio, un esempio molto fastidioso qui .

Non sono sicuro di mysql, ma Oracle usa le sue classi specifiche e non standard per il pool di connessioni.

Le persone usano ancora DBCP, penso che con Hibernate sia persino predefinito.

DBCP non soddisfa le tue attuali esigenze?

Non credo fermamente nella sostituzione dell'infrastruttura a meno che non ci sia già un divario di prestazioni o funzionalità che non può colmare, anche se ci sono alternative più nuove o più elaborate.

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