ventajas statement sentencias prepared preparadas navegador htaccess desventajas caché bind_param aprovechar almacenamiento tomcat servlets jdbc synchronization prepared-statement

statement - ¿Cuál es una buena estrategia para el almacenamiento en caché de las declaraciones preparadas en Tomcat?



sentencias preparadas php pdo (2)

No estoy seguro acerca de otros DB, pero si usa Oracle, el cliente JDBC guardará en caché el PreparedStatement. Es posible que desee ver si su DB lo hace.

Estoy buscando una manera de almacenar en caché las declaraciones preparadas en un entorno de servlet (específicamente, Tomcat 5.5). Esto tiene como objetivo reducir el número de veces que se crean las declaraciones preparadas, es decir, la cantidad de veces que se llama a connection.prepareStatement(sql) .

Mi idea inicial era almacenar objetos PreparedStatement en la sesión, donde la clave (el nombre del atributo) es la consulta misma. Esto también se puede hacer perezosamente.

Sin embargo, alguien me alertó sobre el hecho de que, dependiendo de la implementación del controlador JDBC, se puede acceder a la misma declaración preparada por 2 hilos (o solicitudes) simultáneamente, lo que da como resultado, por ejemplo, el establecimiento de los parámetros incorrectos. Por lo tanto, el acceso a estos objetos de declaración debe sincronizarse.

¿Cuál sería una buena estrategia para lograr esto?

¿Hay algún método incorporado en tomcat para hacer esto? He visto esta respuesta donde menciona el parámetro DBCP poolPreparedStatements , pero no está del todo claro en la documentación si tiene el mismo significado que el que estoy buscando.


El almacenamiento en caché de PreparedStatement generalmente lo proporciona el grupo de conexiones que está utilizando.

Tenga en cuenta que, en la forma en que funciona el grupo de conexiones, un hilo adquiere una conexión, lo utiliza para algunas consultas SQL y lo devuelve al grupo. Solo entonces la conexión estará disponible para otro hilo. A menos que haya un error en el grupo de conexiones, las conexiones no se comparten entre los hilos de manera simultánea .

Por cierto, mi recomendación es usar c3p0 y no DBCP. Tuve muchos problemas con DBCP que se resolvieron una vez que pasé a c3p0.