Tengo una aplicación Spring Boot REST que está conectada a una base de datos Oracle. Estamos usando JDBC usando JdbcTemplate. Las propiedades de la base de datos Oracle se obtienen a través de estas 3 configuraciones de application.properties :
spring.datasource.url
spring.datasource.username
spring.datasource.password
Esta aplicación está utilizando el HikariCP. Desde el sitio web HikariCP, llegué a saber que este grupo no almacena en caché las declaraciones preparadas porque el controlador JDBC es la mejor configuración para hacerlo.
Ahora, ¿dónde y qué especificaría para garantizar esto?
Que el controlador JDBC de Oracle (ojdbc7.jar) almacena en caché las declaraciones preparadas. ¿Hay alguna manera de personalizar la cantidad de declaraciones preparadas que puede almacenar en caché?
Desde https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/ , vemos que
Asegúrese de que su base de datos esté configurada con el tamaño de paquete máximo y que el controlador coincida con ese tamaño de paquete. Para obtener conjuntos de resultados más grandes, esto reduce el número de paquetes totales enviados / recibidos entre el controlador y el servidor.
En cumplimiento de lo anterior, ¿cuáles son los pasos necesarios para
- encontrar el tamaño del paquete del servidor Oracle DB
- averiguar si el servidor Oracle DB está configurado con el tamaño máximo de paquete
- find establece el tamaño del paquete del controlador Oracle JDBC (ojdbc8.jar).
Cualquier otro consejo de optimización de rendimiento JDBC (Oracle) sería apreciado.
Respuestas:
Hola, la función Habilitar almacenamiento en caché de sentencias preparadas no tiene nada que ver ni con Spring ni con REST. Esta función es una cuestión de negociación solo entre su fuente de datos, su controlador JDBC y su base de datos. Para saber cómo configurarlo, lea la documentación relevante sobre su controlador, fuente de datos y base de datos.
Cuando se trata de Hikari, la forma correcta de hacerlo es (observe datasource2 , cambie el nombre a datasource para habilitar la configuración automática):
Las propiedades dentro de su configuración se pasarán directamente al controlador subyacente.
}
Este ejemplo utiliza la inicialización manual de la fuente de datos subyacente.
fuente
cachePrepStmts
es una opción de controlador JDBC de MySQL ver github.com/brettwooldridge/HikariCP/blob/... y dev.mysql.com/doc/connector-j/5.1/en/...data-source-properties
un proxy, pasa propiedades al controlador, por lo que si el controlador no tienecachePrepStmts
propiedades, no funcionará. El controlador ojdbc8 no tiene estas propiedades.oracleDataSource.setImplicitCachingEnabled(true)
connection.setStatementCacheSize(10)
Intente estar más cerca del número de declaraciones más utilizadas El tamaño predeterminado de la memoria caché de instrucciones es 10session_cached_cursors = 50 Connection.setStatementCacheSize(10)
fuente
Comience por verificar la documentación para asegurarse de que
ojdbc8.jar
coincida con la versión del servidor de la base de datos. Hay diferentes versiones deojdbc8.jar
para 11g, 11gR2, 12c.Según esta respuesta , debe
oracle.jdbc.implicitStatementCacheSize
establecer la propiedad en el controlador JDBC. Este artículo menciona algunas propiedades más del controlador JDBC, por ejemplo,oracle.jdbc.freeMemoryOnEnterImplicitCache
ooracle.jdbc.maxCachedBufferSize
. Debe verificar la documentación de su versión del controlador para confirmar que estas propiedades están disponibles.Esto se puede pasar usando la
spring.datasource.hikari.data-source-properties
opción Spring Boot HikariCP . Verifique los documentos para su versión Spring Boot, esta propiedad fue renombrada al menos una vez:application.yaml
application.properties
También es posible que le interese el tamaño de obtención de instrucciones, pero esta optimización generalmente se aplica a cada instrucción por separado.
fuente