2012-08-27 15 views
10

Estoy utilizando, por ejemplo, c3p0 con algunos "maxStatements" definidos para el caché de estado preparado. ¿Qué hace realmente este almacenamiento en caché? Qué tipo de datos almacena en caché ¿En qué nivel (db, aplicación, ...)? Será bueno entenderlo por ejemplo. Por ejemplo, tengo una consultaAlmacenamiento en caché PreparedStatement: qué significa (cómo funciona)

select * from sometable where somecolumn =?

Ahora lo envío en una declaración preparada que no está en caché. Y ahora lo estoy enviando y está en caché. ¡Qué diferencia! Lo que sucedió en el primer caso y en el segundo. ¿Qué se envía al servidor de BD en el primer caso y en el segundo?

Gracias.

Respuesta

9

Sin almacenamiento en caché, obtendrá un nuevo Estado Preparado cada vez que solicite uno de la Conexión. Con el almacenamiento en caché, obtendrá con frecuencia el mismo objeto Java de tipo PreparedStatement si proporciona la misma cadena SQL. Si proporciona el mismo SQL a un PreparedStatement, incluso con diferentes parámetros, a menudo la base de datos puede reutilizar información como el plan de ejecución, pero solo si continúa utilizando el mismo PreparedStatement. El almacenamiento en caché lo hace más fácil al no requerir que su aplicación se aferre a la referencia de PreparedStatement.

8

La respuesta de John Watts es muy buena.

Tenga en cuenta que no se puede proporcionar un código de ejemplo porque el almacenamiento en caché de sentencias es transparente: el código que lo usa se ve exactamente como el código que no lo hace. Simplemente activa el almacenamiento en caché de Statement, en c3p0, estableciendo maxStatements y/o maxStatementsPerConnection en un valor positivo.

Cualquier beneficio de rendimiento del almacenamiento en caché de sentencias depende de la base de datos/controlador JDBC. Para ver si el almacenamiento en caché de sentencias ayuda, intente primero perfilar su aplicación con el almacenamiento en caché de sentencias desactivadas y luego con maxStatementsPerConnection establecido en el número de consultas de declaraciones preparadas que su aplicación usa repetidamente. Para algunas aplicaciones/bases de datos/controladores, verá un beneficio significativo. Para otros, no verá ningún beneficio material.

+0

¿Hay alguna regla general? Mi aplicación se ejecuta secuencialmente alrededor de 100 sqls diferentes. Por lo tanto, supongo que con el conjunto de estados preparados, la proporción de aciertos igual a 50 será 0 (LRU?). – j23

+1

lo más simple es usar 'maxStatementsPerConnection' y configurarlo con el número de declaraciones preparadas _frequently used_ por su aplicación. (esto es, omita las declaraciones que se usan en la inicialización de la aplicación, o que se usan mucho menos con fines administrativos, etc.) si su aplicación siempre ejecuta secuencialmente 100 distintas declaraciones preparadas, entonces, seguro, intente establecer 'maxStatementsPerConnection' en 100, pero existe un riesgo que la memoria y la huella de recursos de eso compensará cualquier beneficio y estarás mejor sin él. Tendrás que ver. –

Cuestiones relacionadas