Poche domande sulla codifica JDBC:
So che la chiamata a close () rilascerà la risorsa. Ma se sappiamo che lo useremo in seguito, perché rilasciarlo e poi richiederlo più tardi?
Che ne dici dell’applicazione multi-client? abbiamo bisogno di un pool di connessioni e quindi dobbiamo creare e chiudere Connection, Statement e PreparedStatement ogni volta?
Grazie,
Personalmente userei un pool in quanto questo si prenderà cura di tutta la gestione delle risorse per voi. Se i requisiti di connessione cambiano, è ansible modificare facilmente la configurazione del pool. Con una piscina sul posto è ansible aprire / chiudere connessioni e istruzioni preparate secondo le migliori pratiche e lasciare la gestione delle risorse al pool.
In genere, quando si utilizza un pool:
Inoltre, a seconda dell’implementazione del pool, potrebbe essere in grado di notificare quando ci sono perdite di risorse che rendono più facile identificare questo tipo di problemi nel codice.
Dai un’occhiata all’origine di un’implementazione di esempio come DBCP : è piuttosto interessante vedere come funzionano.
1. Anche se si dispone di un singolo client, un pool di connessioni potrebbe comunque essere utile. La connessione al database potrebbe richiedere molto tempo, pertanto fare molto spesso potrebbe rallentare l’applicazione con richieste di rete lente. Inoltre, come spiega @teabot, un pool può aiutare a identificare se una connessione non viene chiusa.
2. Non è una buona idea aprire una connessione e lasciarla aperta per sempre per due motivi. Per prima cosa la connessione potrebbe morire se si verifica un’interruzione temporanea della rete. Più a lungo è aperto più è probabile che sia morto quando richiesto. In secondo luogo, una transazione fallita può lasciare la connessione in uno stato non adatto per continuare l’operazione. Di solito è meglio aprire alcune connessioni, riutilizzarle per cinque o dieci minuti, quindi riciclarle.
3. A seconda del database e del driver, la connessione potrebbe disporre di una cache di istruzioni preparata. Anche se si utilizza una connessione diversa, l’RDBMS solitamente memorizza nella cache le istruzioni che sono esattamente uguali, inclusi i parametri. Quindi SELECT * FROM table WHERE value =? come una dichiarazione preparata verrà memorizzata nella cache attraverso le connessioni, ma se si specifica il valore del parametro come SELECT * FROM tabella WHERE value = ‘your_data’ allora probabilmente non verrà memorizzato nella cache lato server.
4. Come spiegato in 3, dipende dall’implementazione RDBMS, fare un punto di riferimento.
5. Non è necessario chiudere e preparare nuovamente una dichiarazione che verrà riutilizzata con parametri diversi. Basta impostare nuovamente i parametri ed eseguire.
Per più client, il database avrà sempre un limite di connessioni simultanee che di solito non è un numero elevato. Se tutti i client passano attraverso una webapp, allora un pool come DBCP va bene. Ma ovviamente non è auspicabile creare un pool per ogni cliente con diverse connessioni aperte in modo permanente.