4

他の誰かがすでにこの質問をしていることは確かですが、それでも満足のいく答えを見つけることができませんでした。したがって、これが私のシナリオです。OracleのJDBCドライバーの暗黙的なステートメントキャッシングを使用したいと思います(ここに記載されています:http://docs.oracle.com/cd/B28359_01/java.111/b31224/stmtcach.htm#i1072607

サードパーティのJDBCプールプロバイダー(より具体的にはTomcat JDBC)からの接続を使用する必要があり、そこで選択することはできません。

問題は、暗黙的なキャッシュを有効にする方法が2段階のプロセスであるということです(ドキュメントによると)。

1.1。

接続でsetImplicitCachingEnabled(true)を呼び出すか、ImplicitCachingEnabledプロパティをtrueに設定してOracleDataSource.getConnectionを呼び出します。OracleDataSource.setImplicitCachingEnabled(true)を呼び出して、ImplicitCachingEnabledを設定します。

2.2。

これらのメソッドの1つを呼び出すことに加えて、物理接続でOracleConnection.setStatementCacheSizeを呼び出す必要もあります。指定する引数は、キャッシュ内のステートメントの最大数です。引数0は、キャッシュがないことを指定します。

私は1で生活することができます(どういうわけかOracleDataSource、プライマリ接続ファクトリとしてを使用するようにプールを構成し、その上でを設定できますOracleDataSource.setImplicitCachingEnabled(true))。しかし、2番目のステップでは、を呼び出すために接続が存在している必要がありますsetStatementCacheSize

私の質問は、暗黙のキャッシュがすでに有効になっている接続statementCacheSizeから取得できるように、データソースレベルでデフォルト値を指定する可能性があるかどうかです。OracleDataSource

PS:ここで見つけたいくつかの関連する質問: Oracle jdbcドライバー:暗黙のステートメントキャッシュまたはsetPoolable(true)?

更新(可能な解決策):

最終的に私はこれをしました:

  1. を使用してネイティブ接続プールを作成しましたoracle.jdbc.pool.OracleDataSource
  2. ネイティブプールを使用するTomcatJDBC接続プールを作成しましたorg.apache.tomcat.jdbc.pool.DataSource(プロパティを参照dataSource)。
  3. 'execution(public java.sql.Connection oracle.jdbc.pool.OracleDataSource.getConnection())'の実行後にオブジェクトを取得し、必要な設定を実行できるように、AOPを介してポイントカットを有効にします。

このソリューションはうまく機能します。私はそれを行うためにいくつかの定型文を書かなければならなかったことにただ不幸です(私は単純な特性を期待していました)。

4

2 に答える 2

6

ホワイトペーパーのOracleJDBCMemory Managementには、次のように書かれています。

11.2ドライバーは、暗黙のステートメントキャッシュを有効にするための新しいプロパティも追加します。

oracle.jdbc.implicitStatementCacheSize

プロパティの値は整数文字列です(例:「100」)。これは、ステートメントキャッシュの初期サイズです。プロパティを正の値に設定すると、暗黙のステートメントキャッシュが有効になります。デフォルトは「0」です。このプロパティは、-Dを介してSystemプロパティとして、またはgetConnectionを介して接続プロパティとして設定できます。

于 2016-05-06T08:50:50.330 に答える
1

OracleConnection.setStatementCacheSizeステートメントのキャッシュサイズは、メソッドを介してのみ変更できます。

すべての接続で呼び出すようにアプリケーションを変更する代わりに、 JDBCインターセプターOracleConnection.setStatementCacheSizeを作成できます。

@Override
public void reset(ConnectionPool pool, PooledConnection connection) {

    if (connection == null) {
        return;
    }

    Connection original = connection.getConnection();

    if (!(original instanceof OracleConnection)) {
        return;
    }

    try {
        if (!((OracleConnection) original).getImplicitCachingEnabled() && implicitCachingEnabled) {

            ((OracleConnection) original).setImplicitCachingEnabled(implicitCachingEnabled);

            log.info("Activated statement cache");

            ((OracleConnection) original).setStatementCacheSize(statementCacheSize);

            log.info("Statement cache size set to " + statementCacheSize);
        }
    } catch (SQLException e) {
        log.error(e.getMessage(), e);
    }
}
于 2013-04-09T17:53:28.440 に答える