使用oracle 12c第2版的ResultSet缓存

时间:2019-04-01 07:35:41

标签: java oracle

我正在尝试使用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。

我无法在这里解决问题。 请帮助。

1 个答案:

答案 0 :(得分:0)

您需要在查询中添加提示以缓存结果集。您可以查看blog以获得更多详细信息吗?