ojdbc7 - oracle jdbc driver
utilizando la característica de caché implícita del controlador Oracle JDBC (2)
Solo puede cambiar el tamaño de la caché de sentencias mediante el método OracleConnection.setStatementCacheSize
.
En lugar de modificar su aplicación para llamar a OracleConnection.setStatementCacheSize
en cada conexión, puede crear un interceptor JDBC .
@Override
public void reset(ConnectionPool pool, PooledConnection connection) {
if (connection == null) {
return;
}
Connection original = connection.getConnection();
if (!(original instanceof OracleConnection)) {
return;
}
try {
if (!((OracleConnection) original).getImplicitCachingEnabled() && implicitCachingEnabled) {
((OracleConnection) original).setImplicitCachingEnabled(implicitCachingEnabled);
log.info("Activated statement cache");
((OracleConnection) original).setStatementCacheSize(statementCacheSize);
log.info("Statement cache size set to " + statementCacheSize);
}
} catch (SQLException e) {
log.error(e.getMessage(), e);
}
}
Estoy bastante seguro de que alguien más ya hizo esta pregunta, pero aún no pude encontrar una respuesta satisfactoria. Entonces, aquí está mi escenario: quiero usar el caché de sentencias implícitas del controlador JDBC de Oracle (documentado aquí: http://docs.oracle.com/cd/B28359_01/java.111/b31224/stmtcach.htm#i1072607 )
Necesito usar las conexiones de un proveedor de grupo JDBC de terceros (para ser más específico, Tomcat JDBC) y no tengo otra opción allí.
El problema es que la forma de habilitar el almacenamiento en caché implícito es un proceso de dos pasos (según la documentación):
1.
Llame a setImplicitCachingEnabled (true) en la conexión o llame a OracleDataSource.getConnection con la propiedad ImplicitCachingEnabled establecida en true. Establece ImplicitCachingEnabled llamando a OracleDataSource.setImplicitCachingEnabled (true)
2.
Además de llamar a uno de estos métodos, también debe llamar a OracleConnection.setStatementCacheSize en la conexión física. El argumento que usted proporciona es el número máximo de declaraciones en la memoria caché. Un argumento de 0 especifica que no hay almacenamiento en caché.
Puedo vivir con 1 (de alguna manera puedo configurar mi grupo para usar OracleDataSource
como fábrica de conexiones primaria y sobre eso puedo configurar OracleDataSource.setImplicitCachingEnabled(true)
). Pero en el segundo paso, ya necesito que la conexión esté presente para llamar a setStatementCacheSize
.
Mi pregunta es si existe la posibilidad de especificar en el nivel de fuente de datos un valor predeterminado para la statementCacheSize
OracleDataSource
caché para que pueda obtener de las conexiones de OracleDataSource
que ya están habilitadas para el almacenamiento en caché implícito.
PD: algunas preguntas relacionadas que encontré aquí: Oracle jdbc driver: implied statement cache o setPoolable (true)?
Actualización (posible solución):
Eventualmente hice esto:
- Creó un grupo de conexión nativo utilizando
oracle.jdbc.pool.OracleDataSource
. - Se creó un grupo de conexiones JDBC de tomcat utilizando
org.apache.tomcat.jdbc.pool.DataSource
que usa el nativo (consulte la propiedaddataSource
). - Habilitado a través de AOP un poincut para que después de la ejecución de ''ejecución (java.sql.Connection pública oracle.jdbc.pool.OracleDataSource.getConnection ())'' recoja el objeto y realice la configuración que quería.
La solución funciona genial; Simplemente no estoy contento de tener que escribir algunos repetitivos para hacerlo (esperaba una propiedad directa).
El libro blanco Oracle JDBC Memory Management dice que
Los controladores 11.2 también agregan una nueva propiedad para habilitar el caché de sentencias implícitas.
oracle.jdbc.implicitStatementCacheSize
El valor de la propiedad es una cadena entera, por ejemplo, "100". Es el tamaño inicial de la memoria caché de sentencias. Establecer la propiedad a un valor positivo habilita la Caché de instrucción implícita. El valor predeterminado es "0". La propiedad se puede establecer como una propiedad del sistema a través de -D o como una propiedad de conexión a través de getConnection.