Gestione di più connessioni JDBC

0

Ho un'applicazione che si connette a database basati su una stringa JSON che contiene informazioni sulla connessione. Il json viene inviato solo all'avvio dell'applicazione.

Come gestisci tali pool di connessioni? Perché posso ottenere più configurazioni che puntano allo stesso database con lo stesso utente. So che non posso creare nuove connessioni ogni volta poiché si tratta di un'operazione costosa, quindi utilizzo i pool di connessioni (Apache DBCP2).

Ma quando due pool si collegano allo stesso database a volte ricevo l'errore "troppe connessioni" poiché la dimensione del pool di due pool è maggiore delle connessioni massime consentite.

Tieni i pool di connessione in una HashMap in cui la stringa di connessione viene utilizzata come chiave per una cattiva idea?

La configurazione è simile a questa (molto semplice JSON):

{
   dbconfig: [
      { database 1 ... },
      { database 2 ... },
      { database 3 ... }
   ],
   otherconfig: { ... }
}

I database 1 e 2 config puntano allo stesso database, o allo stesso server ma a un altro database

Quindi la mia applicazione genera tre thread che ricevono dati su una porta predefinita. Non so quali connessioni di database otterrò e quanti thread di lavoro creerò. E la mia domanda è se esiste una sorta di framework di pool in cui posso lanciare le configurazioni e si occuperà della condivisione delle connessioni e posso solo richiedere la connessione da esso.

Attualmente con il mio design vorrei creare 3 pool da cui 2 pool stanno accedendo allo stesso server e talvolta allo stesso database ed è per questo che ottengo le "troppe connessioni".

    
posta Gabriel 03.12.2014 - 16:18
fonte

2 risposte

1

Prima di tutto, dovresti chiudere le connessioni una volta che hai finito di usarle. Ciò contribuirà a curare gli errori "troppe connessioni" che stai vedendo. A livello di applicazione, devi liberare tutte le risorse condivise che hai non appena hai finito di usarle.

In secondo luogo, sembra che tu stia cercando di duplicare il lavoro che il gestore del pool di connessioni sottostante può fornire per te. In particolare, a livello di applicazione, non preoccuparti dei costi associati alle connessioni di apertura / chiusura: questo è ciò che il gestore del pool gestisce per te. Poiché non hai chiuso le connessioni una volta terminato, rendi più difficile per te il gestore del pool di aiutarti.

Non è chiaro se si dispone di più applicazioni separate che utilizzano gestori di pool separati o applicazioni separate che utilizzano lo stesso gestore di pool. Indipendentemente da ciò, usare una HashMap con la stringa di connessione è una cattiva idea. Come minimo, creerai problemi di comunicazione tra le applicazioni. Nel peggiore dei casi, dovrai provare a coordinare le risorse (connessioni) tra le applicazioni in un server web, che nel migliore dei casi sarà problematico.

Infine, se è necessario disporre di più pool che si connettono allo stesso server di database e il numero totale di connessioni tra tali pool supera quello che può gestire il server DB, è necessario modificare tale configurazione sul server DB. Se veramente hai bisogno di 11 connessioni e il server DB ti dà solo 10, allora devi cambiare il server DB.

Per riepilogare:

  • Chiudi le connessioni già. Stai creando enormi mal di testa nel nome del risparmio di prestazioni percepito.

  • Modifica le impostazioni del server DB se le connessioni sono ancora insufficienti.

risposta data 03.12.2014 - 16:47
fonte
1

Il tuo problema non è un problema di programmazione , si tratta di un problema di configurazione.

1) Configura il tuo database (server) in base alle tue esigenze, ad es. vedi documentazione MySql . È possibile utilizzare due diversi utenti per un database, si desidera accedere con due origini dati diverse. Quindi configurare la quota nel DB e nella propria applicazione; diciamo 200 connessioni ogni utente. Quindi non ci dovrebbero essere problemi di esaurimento delle connessioni.

Lo stesso vale per il terzo pool di connessioni.

2) Cambia il tuo pool di connessioni con qualcosa di diverso Tomcat (ci sono dei motivi per il motivo per cui desideri modificare la pagina o leggi questo ) o C3PO .

Is holding the connection pools in a HashMap where the connection string is used as the key a bad idea?

Non vedo ragioni per questo. Si definiscono 3 origini dati indipendenti. Fatto. Qual è l'usecase per l'hashmap?

3) Pensa di usare un framework che fa dirty per te: ad es. Spring Data JPA . Vedi ulteriori Spring JDBC per il lavoro di livello inferiore JdbcTemplate lascia vicino a nessun desiderio aperto. Non è necessario sporcarsi le mani. Senza un framework, c'è troppo spazio per scrivere e il lavoro è soggetto a errori.

    
risposta data 03.12.2014 - 23:10
fonte

Leggi altre domande sui tag