2012-08-27 10 views
10

Sto usando ad esempio c3p0 con alcuni "maxStatements" definiti per la cache di preparazioneStato. Cosa fa realmente questa memorizzazione nella cache? Che tipo di dati memorizza nella cache. A quale livello (db, application, ..)? Sarà bello capirlo dall'esempio. Per esempio, ho una queryCache di preparazione preparate - cosa vuol dire (come funziona)

selezionare * da qualcosa dove somecolumn =?

Ora lo invio in una dichiarazione preparata che non viene memorizzata nella cache. E ora lo invio e viene memorizzato nella cache. Che differenza. Cosa è successo nel primo caso e nel secondo. Cosa viene inviato al server DB nel primo caso e nel secondo?

Grazie.

risposta

9

Senza memorizzazione nella cache, verrà visualizzato un nuovo PreparedStatement ogni volta che ne viene richiesto uno dalla Connection. Con la memorizzazione nella cache, si ottiene spesso lo stesso oggetto Java di tipo PreparedStatement se si fornisce la stessa stringa SQL. Se si fornisce lo stesso SQL a PreparedStatement, anche con parametri diversi, spesso il database può riutilizzare le informazioni come il piano di esecuzione, ma solo se si continua a utilizzare lo stesso PreparedStatement. La memorizzazione nella cache rende più semplice non richiedendo che la tua app tenga conto di tale riferimento PreparedStatement stesso.

8

La risposta di John Watts è molto buona.

Si noti che non è disponibile alcun codice di esempio perché la cache delle istruzioni è trasparente: il codice che la utilizza sembra esattamente come il codice che non lo è. È sufficiente attivare il caching delle istruzioni in c3p0 impostando maxStatements o maxStatementsPerConnection su un valore positivo.

Qualsiasi vantaggio delle prestazioni dalla memorizzazione nella cache delle istruzioni dipende dal database/dal driver JDBC. Per vedere se il caching delle istruzioni aiuta, prova a profilare la tua app prima con il caching delle istruzioni e poi con maxStatementsPerConnection impostato sul numero di query di istruzioni preparate che la tua app utilizza ripetutamente. Per alcune app/database/driver, vedrai un vantaggio significativo. Per gli altri non vedrai alcun beneficio materiale.

+0

Esiste qualche regola empirica? La mia app esegue in sequenza circa 100 sqls diversi, quindi suppongo che con il pool PreparedStatement uguale a 50 il rapporto di hit sarà 0 (LRU?). – j23

+1

la cosa più semplice da fare è usare 'maxStatementsPerConnection' e impostarlo sul numero di PreparedStatements _frequentemente usato_ dall'applicazione. (che è ignorare le istruzioni utilizzate durante l'inizializzazione delle app, o molto meno frequentemente utilizzate per scopi amministrativi, ecc.) se l'app esegue sempre in sequenza 100 distinti PreparedStatements, quindi prova a impostare 'maxStatementsPerConnection' su 100, ma c'è un rischio che la memoria e l'impronta delle risorse di ciò supereranno qualsiasi beneficio e starai meglio senza. devi vedere. –