我正在尝试使用JDBC API从ResultSet缓存中获取结果。我正在使用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
使用SHUTDOWN IMMEDIATE和STARTUP命令重新启动数据库。
连接到架构并执行以下命令,
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;
}}
在以上代码的for中,我尝试通过执行查询来获取结果集,然后检查rs.isFromResultSetCache是否为true。
第一次,因为第一次获取resultSet,所以isFromResultSetCache为false。 但是根据ResultSet Caching,它应该在下一次迭代中返回true。
我无法在这里解决问题。 请帮助。