使用Oracle JDBC驱动程序隐式缓存功能(using Oracle JDBC driver i

2019-06-27 12:36发布

我敢肯定,别人已经问过这个问题,但我仍然无法找到一个满意的答复。 所以,这里是我的情况:我想用Oracle的JDBC驱动隐含语句缓存(这里记载: http://docs.oracle.com/cd/B28359_01/java.111/b31224/stmtcach.htm#i1072607 )

我需要使用从第三方JDBC池提供商的连接(更具体,Tomcat的JDBC),我没有选择那里。

的问题是,以使隐式高速缓存的方式是一个两步过程(相应于文档):

1。

在连接上调用setImplicitCachingEnabled(真)或与ImplicitCachingEnabled属性设置为true呼叫OracleDataSource.getConnection。 您可以设置通过调用OracleDataSource.setImplicitCachingEnabled ImplicitCachingEnabled(真)

2。

除了调用这些方法之一,您还需要调用OracleConnection.setStatementCacheSize物理连接上。 您提供的参数是在高速缓存中的语句的最大数量。 参数0指定没有缓存。

我可以用1生活(不知何故,我可以配置我的池使用OracleDataSource作为主要连接工厂和我可以设置OracleDataSource.setImplicitCachingEnabled(true) )。 但在第二个步骤,我已经需要连接存在于为了调用setStatementCacheSize

我的问题是,如果有任何的可能性来指定数据源级别的默认值statementCacheSize ,这样我可以从一开始OracleDataSource那些已经隐式缓存使能连接。

PS:一些相关的问题,我在这里找到: Oracle JDBC驱动程序:含蓄语句缓存或setPoolable(真)?

更新(可能的解决方案):

最后,我这样做:

  1. 创建使用本机连接池oracle.jdbc.pool.OracleDataSource
  2. 创建使用Tomcat的JDBC连接池org.apache.tomcat.jdbc.pool.DataSource使用本机之一(见属性dataSource )。
  3. 通过AOP启用poincut以便执行后“执行(公共java.sql.Connection中oracle.jdbc.pool.OracleDataSource.getConnection())”我拾取对象并执行我想要的设置。

该解决方案的伟大工程; 我只是不开心,我不得不写一些样板做到这一点(我期待一个直接的属性)。

Answer 1:

该白皮书的Oracle JDBC内存管理说

11.2驱动程序还添加了一个新的属性,以使隐语句缓存。

oracle.jdbc.implicitStatementCacheSize

该属性的值是一个整数字符串,如“100”。 它是statement cache的初始大小。 该属性设置为正值,使隐性语句缓存。 默认值为“0”。 该属性可以被设置为经由-D或经由的getConnection的连接性的系统属性



Answer 2:

您只能通过改变语句缓存大小OracleConnection.setStatementCacheSize方法。

而不是修改你的应用程序调用OracleConnection.setStatementCacheSize每一个连接上,你可以创建一个JDBC拦截

@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);
    }
}


文章来源: using Oracle JDBC driver implicit caching feature