Oracle JDBC Optimization: Ative o cache PreparedStatement em um aplicativo de inicialização Spring

9

Eu tenho um aplicativo REST do Spring Boot conectado a um banco de dados Oracle. Estamos usando JDBC usando JdbcTemplate. As propriedades do banco de dados Oracle são obtidas por meio dessas 3 configurações application.properties :

spring.datasource.url
spring.datasource.username
spring.datasource.password

Esta aplicação está usando o HikariCP. No site do HikariCP, soube que esse pool não armazena em cache PreparedStatements porque o driver JDBC é a melhor configuração para fazer isso.

Agora, onde e o que eu especificaria para garantir estes:

  1. Que o driver JDBC Oracle (ojdbc7.jar) armazena em cache PreparedStatements. Existe uma maneira de personalizar o número de PreparedStatements que ele pode armazenar em cache.

  2. Em https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/ , vemos que

    Verifique se o seu banco de dados está definido para o tamanho máximo de pacote e se o driver corresponde a esse tamanho de pacote. Para buscar conjuntos de resultados maiores, isso reduz o número total de pacotes enviados / recebidos entre o driver e o servidor.

Em conformidade com o acima exposto, quais são as etapas necessárias para

  1. encontre o tamanho do pacote Oracle DB Server
  2. descubra se o Oracle DB Server está definido para o tamanho máximo de pacote
  3. localizar defina o tamanho do pacote do driver Oracle JDBC (ojdbc8.jar).

Qualquer outra dica de otimização de desempenho JDBC (Oracle) seria apreciada.

anjanb
fonte
É mais adequado perguntar no site dba? dba.stackexchange.com/questions/tagged/oracle
user7294900 14/11/19
2
@ user7294900 Na verdade, não, porque se trata de configurar o driver JDBC (supondo que ele possua essa opção de configuração), o que torna uma questão de programação e não uma questão de DBA.
Mark Rotteveel

Respostas:

2

Olá, a função Habilitar o cache de instruções preparadas não tem nada a ver nem com Spring, nem com REST. Essa função é uma questão de negociação apenas entre sua fonte de dados, seu driver JDBC e seu banco de dados. Para descobrir como configurá-lo, leia a documentação relevante sobre seu driver, fonte de dados e banco de dados.

Quando se trata de Hikari, a maneira correta de fazer isso é (observe datasource2 , renomeie para datasource para habilitar a configuração automática):

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

As propriedades dentro da sua configuração serão passadas diretamente para o driver subjacente.

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

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


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

}

Este exemplo usa inicialização manual da fonte de dados subjacente.

Alexandar Petrov
fonte
Esta é MySQL configuração, cachePrepStmtsé uma opção de driver MySQL JDBC ver github.com/brettwooldridge/HikariCP/blob/... e dev.mysql.com/doc/connector-j/5.1/en/...
Karol Dowbecki
@KarolDowbecki actualy thgis exemplo foi executado no DB2 :)
Alexandar Petrov
O ponto é data-source-propertiesum proxy, ele passa propriedades para o driver, portanto, se o driver não tiver cachePrepStmtspropriedade, ele não funcionará. ojdbc8 driver não possui essas propriedades.
22419 Karol Dowbecki
@KarolDowbecki talvez você deva mudar a pergunta para "De que propriedade você precisa para habilitar o cache de instruções no Oracle" em vez de envolver o REST de inicialização por primavera e o que for. docs.oracle.com/cd/B19306_01/java.102/b14355/…
Alexandar Petrov
@AlexandarPetrov: Oi, eu sou o OP aqui. Eu removi a parte REST. Eu precisava das propriedades de configuração para Oracle 11/12 usando ojdbc7.jar
anjanb
0
  • Ative o cache de instruções por meio de

oracleDataSource.setImplicitCachingEnabled(true)

  • Escolha o tamanho de cache correto para melhor utilizar a memória

connection.setStatementCacheSize(10) Tente estar mais próximo do número de instruções mais usadas O tamanho padrão do cache da instrução é 10

  • Fallback se você não puder alterar o aplicativo para usar o cache de instruções

session_cached_cursors = 50 Connection.setStatementCacheSize(10)

Nirmala
fonte
Não tenho acesso ao OracleDatasource. Tudo o que tenho acesso é o JdbcTemplate a partir do qual vou obter a fonte de dados Hikari. Também não vou para o nível de conexão - trabalho no nível JdbcTemplate.
Anjanb 15/11/19
0

Comece verificando a documentação para garantir que ojdbc8.jarcorresponde à versão do servidor de banco de dados. Existem diferentes versões ojdbc8.jarpara 11g, 11gR2, 12c.

De acordo com esta resposta , é necessário oracle.jdbc.implicitStatementCacheSizeconfigurar a propriedade no driver JDBC. Este artigo menciona mais algumas propriedades do driver JDBC, por exemplo, oracle.jdbc.freeMemoryOnEnterImplicitCacheou oracle.jdbc.maxCachedBufferSize. Você precisa verificar a documentação do seu driver para confirmar se essas propriedades estão disponíveis.

Isso pode ser passado usando a spring.datasource.hikari.data-source-propertiesopção Spring Boot HikariCP . Verifique os documentos da sua versão do Spring Boot. Essa propriedade foi renomeada pelo menos uma 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 

Você também pode estar interessado no tamanho da busca de instruções, mas essa otimização geralmente é aplicada a cada instrução separadamente.

Karol Dowbecki
fonte
Oi @Karol, obrigado. Como reformularia essas propriedades usando o arquivo application.properties em vez de um arquivo application.yml?
Anjanb 25/11/19