我很确定其他人已经问过这个问题了,但我仍然找不到满意的答案。 所以,这是我的场景:我想使用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)?
更新(可能的解决方案):
最终我这样做了:
oracle.jdbc.pool.OracleDataSource
创建了一个本机连接池。org.apache.tomcat.jdbc.pool.DataSource
创建了一个使用本地连接池的tomcat JDBC连接池(请参阅属性dataSource
)。解决方案效果很好;我只是不高兴我不得不写一些样板来做它(我期待一个直接的属性)。
答案 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);
}
}