ResultSet кеширование с использованием оракула 12c выпуск 2 - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь получить результаты из 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.

Я не могу понять проблему здесь.Пожалуйста, помогите.

1 Ответ

0 голосов
/ 09 апреля 2019

Вам нужно добавить подсказки в запросе для кэширования набора результатов.Можете ли вы просмотреть блог для более подробной информации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...