Oracle JDBC优化:在Spring Boot应用程序中启用PreparedStatement缓存


9

我有一个连接到Oracle数据库的Spring Boot REST应用程序。我们正在通过JdbcTemplate使用JDBC。Oracle数据库属性是通过以下3个application.properties设置获得的:

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

该应用程序正在使用HikariCP。从HikariCP网站上,我知道该池不缓存PreparedStatements,因为JDBC驱动程序是最好的设置。

现在,我将在哪里指定什么来确保这些:

  1. Oracle JDBC驱动程序(ojdbc7.jar)缓存PreparedStatements。有没有一种方法可以自定义它可以缓存的PreparedStatements的数量。

  2. https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/中,我们看到

    确保将数据库设置为最大数据包大小,并且驱动程序与该数据包大小匹配。为了获取更大的结果集,这减少了驱动程序和服务器之间发送/接收的总数据包数量。

为此,需要采取哪些步骤?

  1. 查找Oracle DB Server数据包大小
  2. 查找是否将Oracle DB Server设置为最大数据包大小
  3. 查找设置Oracle JDBC驱动程序的(ojdbc8.jar)数据包大小。

任何其他(Oracle)JDBC性能优化技巧将不胜感激。



2
@ user7294900并非如此,因为这是关于配置JDBC驱动程序(假设它甚至具有这样的配置选项),这使这成为编程问题,而不是DBA问题。
Mark Rotteveel

Answers:


2

嗨,功能Enable Prepared语句缓存与Spring无关,与REST无关。此函数是仅在数据源,JDBC驱动程序和数据库之间进行协商的问题。为了找到如何设置它,请阅读有关驱动程序,数据源和数据库的相关文档。

当涉及到Hikari时,执行此操作的正确方法是(注意datasource2,重命名为datasource以启用自动配置):

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

配置内部的属性将直接传递给基础驱动程序。

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

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


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

}

本示例使用基础数据源的手动初始化。


这是MySQL的配置,cachePrepStmts是一个MySQL JDBC驱动程序选项,看到github.com/brettwooldridge/HikariCP/blob/...dev.mysql.com/doc/connector-j/5.1/en/...
卡罗尔Dowbecki

@KarolDowbecki实际上在DB2上运行了这个例子:)
Alexandar Petrov,

Point是data-source-properties代理,它将属性传递给驱动程序,因此,如果驱动程序没有cachePrepStmts属性,它将无法正常工作。ojdbc8驱动程序没有此属性。
卡罗尔·道贝克

@KarolDowbecki也许您应该将问题更改为“您需要什么属性才能在Oracle中启用语句缓存”,而不是使用spring boot REST等。docs.oracle.com/cd/B19306_01/java.102/b14355/...
亚力山大·彼得罗夫

@AlexandarPetrov:嗨,我是这里的OP。我删除了REST部分。我需要使用ojdbc7.jar来配置Oracle 11/12的配置属性
anjanb,

0
  • 通过启用语句缓存

oracleDataSource.setImplicitCachingEnabled(true)

  • 选择正确的缓存大小以最佳利用内存

connection.setStatementCacheSize(10) 尝试接近最常用的语句数默认语句缓存大小为10

  • 如果无法将应用程序更改为使用语句缓存,则进行回退

session_cached_cursors = 50 Connection.setStatementCacheSize(10)


我无权访问OracleDatasource。我只能访问JdbcTemplate,从中我将获得Hikari数据源。我也不去连接级别,而是在JdbcTemplate级别工作。
anjanb

0

首先检查文档,以确保您ojdbc8.jar与数据库服务器版本匹配。有ojdbc8.jar11g,11gR2、12c的不同版本。

按照此答案,您需要oracle.jdbc.implicitStatementCacheSize在JDBC驱动程序中设置属性。本文提到了更多的JDBC驱动程序属性,例如oracle.jdbc.freeMemoryOnEnterImplicitCacheoracle.jdbc.maxCachedBufferSize。您需要检查驱动程序版本的文档以确认这些属性可用。

这可以使用Spring Boot HikariCP spring.datasource.hikari.data-source-properties选项来传递。请仔细检查您的Spring Boot版本的文档,此属性至少已重命名一次:

application.yaml

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

application.properties

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

您可能还对语句提取大小感兴趣,但是此优化通常分别应用于每个语句。


嗨,@ Karol,谢谢。如何使用application.properties文件而不是application.yml文件来重新定义这些属性?
anjanb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.