使用 oracle 12c 第 2 版的结果集缓存



我正在尝试使用 JDBC API 从结果集缓存中获取结果。我正在使用Oracle 12c R2数据库(ojdbc8.jar)。

我进行了以下配置以支持相同的功能,如下所示:

ALTER SYSTEM SET CLIENT_RESULT_CACHE_SIZE=1G SCOPE=SPFILE
ALTER SYSTEM SET CLIENT_RESULT_CACHE_LAG=1000 SCOPE=SPFILE

使用立即关闭和启动命令重新启动数据库。

连接到架构并执行以下命令,

ALTER TABLE TABLE_NAME RESULT_CACHE(MODE FORCE)

我开发的测试程序:

public class OracleResultsetCacheDemo {
Connection con = null;  
public static void main(String[] args) {         
OracleResultsetCacheDemo tester = new OracleResultsetCacheDemo();
tester.performOperation();
}
public void performOperation() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection("url", "user", "pass");
String query = "select /*+RESULTSET_CACHE*/ * from <table_name>";
System.out.println("Default : "+((oracle.jdbc.OracleConnection)con).getImplicitCachingEnabled());           ((oracle.jdbc.OracleConnection)con).setImplicitCachingEnabled(true);            ((oracle.jdbc.OracleConnection)con).setStatementCacheSize(10);  System.out.println("After setting manually: "((oracle.jdbc.OracleConnection)con).getImplicitCachingEnabled());
PreparedStatement stm;
OracleResultSet rs;
for (int i = 0; i < 10; i++) {
stm = con.prepareStatement(query);
long startTime = System.currentTimeMillis();
rs = (OracleResultSet) stm.executeQuery();
System.out.println("isFromResultSetCache:"+rs.isFromResultSetCache() );  
while (rs.next()) {
//do somthing
}
rs.close();
stm.close();
long endTime = System.currentTimeMillis();
long finalTime = endTime - startTime;
System.out.println(getTimeStamp(finalTime));
}             
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public String getTimeStamp(long finalTime) {
long millis = finalTime % 1000;
long second = (finalTime / 1000) % 60;
long minute = (finalTime / (1000 * 60)) % 60;
long hour = (finalTime / (1000 * 60 * 60)) % 24;
String time = String.format("%02d:%02d:%02d.%d", hour, minute, second, millis);
return time;
}}

在上面的代码中,我尝试通过执行查询来获取结果集,然后检查 rs.isFromResultSetCache 是否为 true。

isFromResultSetCache 第一次是假的,因为 resultSet 是第一次获取的。 但它应该在下一次迭代中根据结果集缓存返回为 true。

我无法弄清楚这里的问题。 请帮忙。

您需要在查询中添加用于缓存结果集的提示。你能查看博客了解更多细节吗?