Я пытаюсь получить результаты из ResultSet Cache, используя 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
Перезапустил базу данных с помощью команд 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;
}}
В приведенном выше коде я пытаюсьполучить набор результатов, выполнив запрос, а затем проверить, является ли значение rs.isFromResultSetCache истинным.
Впервые isFromResultSetCache имеет значение false, поскольку resultSet выбирается впервые.Но он должен был вернуться как true в следующей итерации в соответствии с ResultSet Caching.
Я не могу понять проблему здесь.Пожалуйста, помогите.