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:
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.
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
- encontre o tamanho do pacote Oracle DB Server
- descubra se o Oracle DB Server está definido para o tamanho máximo de pacote
- localizar defina o tamanho do pacote do driver Oracle JDBC (ojdbc8.jar).
Qualquer outra dica de otimização de desempenho JDBC (Oracle) seria apreciada.
fonte
Respostas:
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):
As propriedades dentro da sua configuração serão passadas diretamente para o driver subjacente.
}
Este exemplo usa inicialização manual da fonte de dados subjacente.
fonte
cachePrepStmts
é uma opção de driver MySQL JDBC ver github.com/brettwooldridge/HikariCP/blob/... e dev.mysql.com/doc/connector-j/5.1/en/...data-source-properties
um proxy, ele passa propriedades para o driver, portanto, se o driver não tivercachePrepStmts
propriedade, ele não funcionará. ojdbc8 driver não possui essas propriedades.oracleDataSource.setImplicitCachingEnabled(true)
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 é 10session_cached_cursors = 50 Connection.setStatementCacheSize(10)
fonte
Comece verificando a documentação para garantir que
ojdbc8.jar
corresponde à versão do servidor de banco de dados. Existem diferentes versõesojdbc8.jar
para 11g, 11gR2, 12c.De acordo com esta resposta , é necessário
oracle.jdbc.implicitStatementCacheSize
configurar a propriedade no driver JDBC. Este artigo menciona mais algumas propriedades do driver JDBC, por exemplo,oracle.jdbc.freeMemoryOnEnterImplicitCache
ouoracle.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-properties
opção Spring Boot HikariCP . Verifique os documentos da sua versão do Spring Boot. Essa propriedade foi renomeada pelo menos uma vez:application.yaml
application.properties
Você também pode estar interessado no tamanho da busca de instruções, mas essa otimização geralmente é aplicada a cada instrução separadamente.
fonte