2010-06-12 12 views
6

Sto cercando di capire se è efficiente per me memorizzare tutte le mie istruzioni quando creo la connessione al mio database o se devo solo creare quelle che sono più utilizzate e creare le altre se/quando 're necessario ..È costoso mantenere le PreparedStatements? (Java e JDBC)

sembra sciocco per creare tutte delle dichiarazioni in tutte i thread client. Qualsiasi commento sarebbe molto apprezzato.

risposta

9

Un database un po 'decente le memorizzerà già nella cache. Basta sparare Connection#prepareStatement() nel momento in cui hai effettivamente bisogno di eseguire la query. In realtà non hai altra scelta poiché connessione, istruzione e gruppo di risultati dovrebbero essere acquisiti e chiusi nello scope il più breve possibile, ad esempio in un blocco try-finally nello stesso metodo in cui si esegue la query.

Aprire e chiudere la connessione su ogni query a sua volta può essere davvero costoso. Una soluzione comune è l'utilizzo di connection pool, ad esempio c3p0.

2

Questo mi sembra il tipo di ottimizzazione prematura di cui non mi preoccuperei fino a quando non avrò alcune informazioni che mi dicono che è importante. Se il tuo accesso al database è inefficiente, sospetto il tuo schema o l'accesso ai valori prima di pensare a mettere in cache le istruzioni preparate.

4

penso che tu sia preoccuparsi troppo, le istruzioni preparate già beneficiare di diversi livello di caching:

  • a livello di database: un database decente riutilizzare il piano di accesso per un dato dichiarazione preparata.
  • A livello del pool di connessione: un pool di connessione decente memorizza nella cache gli oggetti PreparedStatement per ciascuna connessione al database nel pool (e restituisce una cache PreparedStatement sulle chiamate successive a preparedStatement su una connessione).

Quindi, in realtà, direi che potresti essere nella direzione sbagliata. La soluzione migliore se si desidera progettare una soluzione scalabile è utilizzare un pool di connessioni e non tenere una connessione più a lungo del necessario e rilasciarla (per rilasciare le risorse del database) una volta terminata.