2012-06-11 19 views
5

Se utilizzo sempre uno solo Statement alla volta, sarebbe opportuno inserirlo nella cache insieme al mio Connection. Ho già messo in cache la connessione in modo da poter memorizzare nella cache quasi senza alcun costo.Qual è il costo di una dichiarazione

Sostanzialmente suppongo che mi stia chiedendo se ci sono costi/spese generali per creare una dichiarazione. Comprendo appieno i vantaggi della creazione di dichiarazioni preparate. Sto parlando specificatamente di Connection.createStatement() qui.

+2

Suppongo sempre che ci sia un sovraccarico, ma supporrei sempre che il sovraccarico non valga la pena di aggiungere complessità all'applicazione, a meno che non si disponga di una misura che indica che si tratta di un miglioramento delle prestazioni necessario. –

+0

Sarebbe come: Se la mia applicazione sta creando milioni di istruzioni, allora Sì, No. No ... – Nik

risposta

0

Alcune ricerche su un driver jdbc open source (jtds) suggeriscono il seguente overhead di oggetto per ogni Istruzione creata. Sto cercando di contare il costo della creazione di un nuovo Statement ogni volta che voglio interrogare il database piuttosto che mantenere una sola cache uno e riutilizzarlo:

  1. A Connection - Presumibilmente memorizzati nella cache in modo insignificante.
  2. A TdsCore - Sembra un'implementazione del protocollo ma è memorizzato nella cache in modo insignificante.
  3. A ResultSet.
  4. Un ArrayList di articoli batch.
  5. Un ArrayList di aperto ResultSet s.
  6. Meta dati colonna.

Quindi sembra che la percentuale più alta del costo di Statement s riguardi ciò che rimane da qualsiasi query che è stata eseguita.

4

Il costo di una dichiarazione non può essere quantificato indipendentemente da altri fattori; per esempio. il database, i driver JDBC, l'SQL nella dichiarazione e così via.

Si può essere sicuri che ci sarà un sovraccarico nella creazione di un Statement (o PreparedStatement) e nell'esecuzione per la prima volta. Tuttavia, ci sono buone probabilità che non sia significativo per le prestazioni complessive dell'applicazione. E se non lo è, implementare il codice di cache sarà semplicemente uno sforzo inutile.

Non si dovrebbe indovinare se questo è (o meno) sarà un utile ottimizzazione. Quello che dovresti fare è far funzionare il tuo programma, POI profilarlo, POI usare i dati di profilazione per determinare cosa deve essere ottimizzato. Se viene impiegata una quantità significativa di tempo nell'esecuzione delle stesse query, la cache potrebbe essere utile nella versione e forse no. Provalo e vedi se fa una differenza misurabile per le prestazioni.

+0

È noto che il 'caching' Connection's è una buona idea. Pertanto memorizzerò sempre 'Connection's senza perdere tempo a raccogliere le metriche. Speravo solo che ci fosse un po 'di saggezza riguardo a 'Statement's. – OldCurmudgeon

+0

Le connessioni nella cache sono solo una buona idea se è necessario. Se non è necessario, hai sprecato tempo per lo sviluppatore implementandolo. Accade così che ci siano librerie di pool di connessione standard e non sprechi * molto * tempo se le usi inutilmente. Ma il mio punto è che non dovresti sprecare tempo a ottimizzare ... oa cercare le tecniche di ottimizzazione ... se non ci sono prove che sia necessario. E per il caching delle istruzioni non hai alcuna prova generale e dubito che esista. –

Problemi correlati