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


9

Oracleデータベースに接続されているSpring Boot RESTアプリケーションがあります。JdbcTemplateを使用してJDBCを使用しています。Oracleデータベースのプロパティは、次の3つのapplication.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パフォーマンス最適化のヒントをいただければ幸いです。


dbaサイトで質問する方が適切ですか?dba.stackexchange.com/questions/tagged/oracle
user7294900

2
@ user7294900なぜなら、これはJDBCドライバーの構成に関するものであるため(そのような構成オプションも想定されているため)、DBAの質問ではなくプログラミングの質問になります。
Mark Rotteveel、

回答:


2

こんにちは、「準備済みステートメントのキャッシュを有効にする」機能は、SpringでもRESTでも何の関係もありません。この関数は、データソース、JDBCドライバー、およびデータベース間のネゴシエーションの問題です。それを設定する方法を見つけるために、ドライバー、データソース、データベースに関する関連ドキュメントを読んでください。

Hikariに関しては、これを行う正しい方法は次のとおりです(datasource2に通知し、データソースに名前を変更して自動構成を有効にします)。

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
Karol Dowbecki

@KarolDowbecki実際の例はDB2で実行されていました:)
Alexandar Petrov

ポイントはdata-source-propertiesプロキシであり、プロパティをドライバに渡すため、ドライバにcachePrepStmtsプロパティがない場合は機能しません。ojdbc8ドライバーにはこのプロパティはありません。
Karol Dowbecki

@KarolDowbeckiおそらく、スプリングブートRESTなどを使用するのではなく、質問を「Oracleでステートメントキャッシュを有効にするために必要なプロパティ」に変更する必要があります。docs.oracle.com/cd/B19306_01/java.102/b14355/...
Alexandarペトロフ

@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ドライバーでプロパティを設定する必要があります。この記事では、oracle.jdbc.freeMemoryOnEnterImplicitCacheやなど、JDBCドライバーのプロパティについて説明します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 

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


こんにちは@Karol、ありがとう。application.ymlファイルの代わりにapplication.propertiesファイルを使用してこれらのプロパティをどのように言い換えればよいでしょうか?
anjanb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.