10

我有一个连接到 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 Driver(ojdbc7.jar) 缓存 PreparedStatements。有没有办法自定义它可以缓存的 PreparedStatements 的数量。

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

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

根据上述情况,需要哪些步骤

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

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

4

3 回答 3

3

嗨,启用准备好的语句缓存功能与 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();

}

此示例使用底层数据源的手动初始化。

于 2019-11-22T12:19:29.763 回答
1

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

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

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

应用程序.yaml

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

应用程序属性

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

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

于 2019-11-22T12:37:25.970 回答
0
  • 通过启用语句缓存

oracleDataSource.setImplicitCachingEnabled(true)

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

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

  • 如果您无法更改应用程序以使用语句缓存,则回退

session_cached_cursors = 50 Connection.setStatementCacheSize(10)

于 2019-11-14T21:18:27.633 回答