web-dev-qa-db-ja.com

Oracle JDBC最適化:SpringブートアプリケーションでPreparedStatementキャッシングを有効にする

Spring Boot RESTアプリケーションがOracleデータベースに接続されています。JdbcTemplateを使用してJDBCを使用しています。Oracleデータベースのプロパティは、これら3つのアプリケーションから取得されます。 .properties設定:

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

このアプリはHikariCPを使用しています。 HikariCPのWebサイトから、JDBCドライバーがそれを行うのに最適なセットアップであるため、このプールはPreparedStatementsをキャッシュしないことがわかりました。

ここで、これらを確実にするためにどこで何を指定しますか?

  1. Oracle JDBCドライバー(ojdbc7.jar)がPreparedStatementsをキャッシュすること。キャッシュできるPreparedStatementsの数をカスタマイズする方法はありますか?.

  2. https://howtodoinjava.com/Java/jdbc/best-practices-to-improve-jdbc-performance/ から、

    データベースが最大パケットサイズに設定されていること、およびドライバーがそのパケットサイズと一致していることを確認してください。より大きな結果セットをフェッチする場合、これにより、ドライバーとサーバー間で送受信される合計パケット数が減少します。

上記に準拠して、に必要な手順は何ですか

  1. oracle DBサーバーのパケットサイズを見つける
  2. oracle DBサーバーが最大パケットサイズに設定されているかどうかを確認する
  3. oracle JDBCドライバーの(ojdbc8.jar)パケットサイズを設定します。

その他の(Oracle)JDBCパフォーマンス最適化のヒントがあれば幸いです。

9
anjanb

こんにちは、「準備済みステートメントのキャッシュを有効にする」機能は、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();

}

この例では、基になるデータソースの手動初期化を使用しています。

2

まず、ドキュメントをチェックして、ojdbc8.jarがデータベースサーバーのバージョンと一致していることを確認します。 11g、11gR2、12cにはojdbc8.jarのさまざまなバージョンがあります。

この答え に従って、JDBCドライバーでOracle.jdbc.implicitStatementCacheSizeプロパティを設定する必要があります。 この記事 は、JDBCドライバーのプロパティについてさらにいくつか言及しています。 Oracle.jdbc.freeMemoryOnEnterImplicitCacheまたはOracle.jdbc.maxCachedBufferSize。これらのプロパティが使用可能であることを確認するには、ドライバーのバージョンのドキュメントを確認する必要があります。

これは、Spring Boot HikariCP spring.datasource.hikari.data-source-properties オプションを使用して渡すことができます。 Spring Bootバージョンのドキュメントを再確認してください。このプロパティの名前は少なくとも1回は変更されています。

application.yaml

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

application.properties

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

ステートメントフェッチサイズ にも興味があるかもしれませんが、この最適化は通常、各ステートメントに個別に適用されます。

0
Karol Dowbecki
  • ステートメントキャッシュを有効にする

oracleDataSource.setImplicitCachingEnabled(true)

  • メモリを最大限に活用するために適切なキャッシュサイズを選択する

connection.setStatementCacheSize(10)最もよく使用されるステートメントの数に近づくようにしてくださいデフォルトのステートメントキャッシュサイズは10です

  • ステートメントキャッシュを使用するようにアプリケーションを変更できない場合のフォールバック

session_cached_cursors = 50 Connection.setStatementCacheSize(10)

0
Nirmala