使用Oracle JDBC驱动程序隐式缓存功能

时间:2012-08-28 20:32:04

标签: oracle jdbc oracle11g driver

我很确定其他人已经问过这个问题了,但我仍然找不到满意的答案。   所以,这是我的场景:我想使用Oracle的JDBC驱动程序隐式语句缓存(在此处记录:http://docs.oracle.com/cd/B28359_01/java.111/b31224/stmtcach.htm#i1072607

我需要使用来自第三方JDBC池提供程序的连接(更具体地说,Tomcat JDBC),我别无选择。

问题是启用隐式缓存的方法分为两步(相应于文档):

1

  

在连接上调用setImplicitCachingEnabled(true)    要么   使用ImplicitCachingEnabled调用OracleDataSource.getConnection   属性设置为true。您通过调用设置ImplicitCachingEnabled   OracleDataSource.setImplicitCachingEnabled(真)

2

  

除了调用其中一种方法外,您还需要调用   物理连接上的OracleConnection.setStatementCacheSize。该   您提供的参数是缓存中的最大语句数。   参数0指定不缓存。

我可以忍受1(不知何故,我可以将我的池配置为使用OracleDataSource作为主连接工厂,并且我可以设置OracleDataSource.setImplicitCachingEnabled(true))。 但是在第二步,我已经需要连接才能调用setStatementCacheSize

我的问题是,是否有可能在数据源级别指定statementCacheSize的默认值,以便我可以从已启用隐式缓存的OracleDataSource连接中获取。 / p>

PS:我在这里找到的一些相关问题: Oracle jdbc driver: implicit statement cache or setPoolable(true)?

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

最终我这样做了:

  1. 使用oracle.jdbc.pool.OracleDataSource创建了一个本机连接池。
  2. 使用org.apache.tomcat.jdbc.pool.DataSource创建了一个使用本地连接池的tomcat JDBC连接池(请参阅属性dataSource)。
  3. 通过AOP启用一个poincut,以便执行'execution(public java.sql.Connection oracle.jdbc.pool.OracleDataSource.getConnection())'后,我拾取对象并执行我想要的设置。
  4. 解决方案效果很好;我只是不高兴我不得不写一些样板来做它(我期待一个直接的属性)。

2 个答案:

答案 0 :(得分:4)

白皮书Oracle JDBC Memory Management说明了

  

11.2驱动程序还添加了一个新属性来启用隐式语句缓存。

     

oracle.jdbc.implicitStatementCacheSize

     

该属性的值是   整数字符串,例如“100”。它是声明的初始大小   缓存。将属性设置为正值可启用Implicit   语句缓存。 默认值为“0”。该属性可以设置为   系统属性通过-D 或通过getConnection作为连接属性。

答案 1 :(得分: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);
    }
}