Oracle JDBC Optimization: habilite el almacenamiento en caché de PreparedStatement en una aplicación de arranque Spring

9

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?

  1. 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é?

  2. 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

  1. encontrar el tamaño del paquete del servidor Oracle DB
  2. averiguar si el servidor Oracle DB está configurado con el tamaño máximo de paquete
  3. 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.

anjanb
fuente
¿Es más adecuado preguntar en el sitio dba? dba.stackexchange.com/questions/tagged/oracle
user7294900
2
@ user7294900 En realidad no, porque se trata de configurar el controlador JDBC (suponiendo que incluso tenga esa opción de configuración), lo que hace que sea una pregunta de programación y no una pregunta de DBA.
Mark Rotteveel

Respuestas:

2

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):

spring:
  datasource2:
      dataSourceClassName: com.zaxxer.hikari.HikariDatasource
       .....
       ......
      configuration:
            maximumPoolSize: 25  
            data-source-properties:
               ImplicitCachingEnabled: true
               MaxStatements: 100

Las propiedades dentro de su configuración se pasarán directamente al controlador subyacente.

@Bean
@ConfigurationProperties("spring.datasource2")
public DataSourceProperties dataSourceProperties2() {
    return new DataSourceProperties();
}

@Bean()
@ConfigurationProperties("spring.datasource2.configuration")
public DataSource hikariDatasource() {


    return dataSourceProperties2().initializeDataSourceBuilder().build();

}

Este ejemplo utiliza la inicialización manual de la fuente de datos subyacente.

Alexandar Petrov
fuente
Esta es MySQL config, cachePrepStmtses una opción de controlador JDBC de MySQL ver github.com/brettwooldridge/HikariCP/blob/... y dev.mysql.com/doc/connector-j/5.1/en/...
Karol Dowbecki
@KarolDowbecki realmente este ejemplo se estaba ejecutando en DB2 :)
Alexandar Petrov
El punto es data-source-propertiesun proxy, pasa propiedades al controlador, por lo que si el controlador no tiene cachePrepStmtspropiedades, no funcionará. El controlador ojdbc8 no tiene estas propiedades.
Karol Dowbecki
@KarolDowbecki tal vez debería cambiar la pregunta a "¿Qué propiedad necesita para habilitar el almacenamiento en caché de instrucciones en Oracle" en lugar de involucrar REST de arranque de primavera y lo que sea. docs.oracle.com/cd/B19306_01/java.102/b14355/…
Alexandar Petrov
@AlexandarPetrov: Hola, soy el OP aquí. Eliminé la parte REST. Necesitaba las propiedades de configuración para Oracle 11/12 usando ojdbc7.jar
anjanb
0
  • Habilitar el almacenamiento en caché de instrucciones

oracleDataSource.setImplicitCachingEnabled(true)

  • Elija el tamaño de caché correcto para utilizar mejor la memoria

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 10

  • Recurrir si no puede cambiar la aplicación para usar el almacenamiento en caché de instrucciones

session_cached_cursors = 50 Connection.setStatementCacheSize(10)

Nirmala
fuente
No tengo acceso a OracleDatasource. Todo lo que tengo acceso es el JdbcTemplate del que obtendré la fuente de datos Hikari. Tampoco voy al nivel de conexión, trabajo en el nivel JdbcTemplate.
anjanb
0

Comience por verificar la documentación para asegurarse de que ojdbc8.jarcoincida con la versión del servidor de la base de datos. Hay diferentes versiones de ojdbc8.jarpara 11g, 11gR2, 12c.

Según esta respuesta , debe oracle.jdbc.implicitStatementCacheSizeestablecer la propiedad en el controlador JDBC. Este artículo menciona algunas propiedades más del controlador JDBC, por ejemplo, oracle.jdbc.freeMemoryOnEnterImplicitCacheo oracle.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-propertiesopción Spring Boot HikariCP . Verifique los documentos para su versión Spring Boot, esta propiedad fue renombrada al menos una vez:

application.yaml

spring:
  datasource:
    hikari:
      data-source-properties:
        oracle.jdbc.implicitStatementCacheSize: 100  

application.properties

spring.datasource.hikari.data-source-properties.oracle.jdbc.implicitStatementCacheSize: 100 

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.

Karol Dowbecki
fuente
Hola @ Karol, gracias. ¿Cómo reformularía estas propiedades usando el archivo application.properties en lugar de un archivo application.yml?
anjanb