Оптимізація Oracle JDBC: увімкнення кешованої програми ReadyStatement у додатку Spring


9

У мене є програма Spring Boot REST, яка підключена до бази даних Oracle. Ми використовуємо JDBC за допомогою JdbcTemplate. Властивості бази даних Oracle отримуються за допомогою цих 3 параметрів application.properties :

spring.datasource.url
spring.datasource.username
spring.datasource.password

Ця програма використовує HikariCP. З веб-сайту HikariCP я дізнався, що цей пул не кешує PreparedStatements, оскільки для цього найкраще налаштований драйвер JDBC.

Тепер, де і що я б зазначив, щоб забезпечити це:

  1. Що драйвер Oracle JDBC (ojdbc7.jar) кешує PreparedStatements. Чи є спосіб налаштувати кількість готових статей, які вона може кешувати.

  2. З https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/ ми бачимо, що

    Переконайтеся, що для вашої бази даних встановлено максимальний розмір пакета і що драйвер відповідає цьому розміру пакету. Для отримання більших наборів результатів це зменшує кількість загальних пакетів, надісланих / отриманих між драйвером та сервером.

На виконання сказаного, які кроки потрібно зробити

  1. знайти розмір пакета Oracle DB Server
  2. з'ясуйте, чи встановлений Oracle DB Server максимальним розміром пакету
  3. знайти встановити розмір пакета драйвера Oracle JDBC (ojdbc8.jar).

Будемо вдячні за будь-який інший підказник щодо оптимізації продуктивності JDBC (Oracle).


Чи підходить запитати на сайті dba? dba.stackexchange.com/questions/tagged/oracle
user7294900

2
@ user7294900 Не дуже, тому що це стосується налаштування драйвера JDBC (якщо припустити, що він навіть має такий варіант конфігурації), що робить це питання програмування, а не питання DBA.
Марк Rotteveel

Відповіді:


2

Привіт, функція Увімкнути підготовлений кешування операторів не має нічого спільного ні з Spring, ні з REST. Ця функція є питанням узгодження лише між вашим джерелом даних, вашим драйвером JDBC та вашою базою даних. Щоб дізнатися, як його налаштувати, прочитайте відповідну документацію про драйвер, джерело даних та базу даних.

Що стосується Hikari, то правильним способом цього є (помітити datasource2 , перейменувати на джерело даних, щоб увімкнути автоконфігурацію):

spring:
  datasource2:
      dataSourceClassName: com.zaxxer.hikari.HikariDatasource
       .....
       ......
      configuration:
            maximumPoolSize: 25  
            data-source-properties:
               ImplicitCachingEnabled: true
               MaxStatements: 100

Властивості всередині вашої конфігурації будуть передані безпосередньо драйверу.

@Bean
@ConfigurationProperties("spring.datasource2")
public DataSourceProperties dataSourceProperties2() {
    return new DataSourceProperties();
}

@Bean()
@ConfigurationProperties("spring.datasource2.configuration")
public DataSource hikariDatasource() {


    return dataSourceProperties2().initializeDataSourceBuilder().build();

}

У цьому прикладі використовується ручна ініціалізація базового джерела даних.


Це конфігурація MySQL, cachePrepStmtsце параметр з драйвером MySQL JDBC, див. Github.com/brettwooldridge/HikariCP/blob/… та dev.mysql.com/doc/connector-j/5.1/uk/…
Karol Dowbecki

@KarolDowbecki фактично цей приклад працював на DB2 :)
Олександр Петров

Point - data-source-propertiesце проксі-сервер, він передає властивості драйверу, тому, якщо у драйвера немає cachePrepStmtsвластивості, він не працюватиме. драйвер ojdbc8 не має цих властивостей.
Karol Dowbecki

@KarolDowbecki, можливо, вам слід змінити питання на "Яке властивість вам потрібне для того, щоб увімкнути кешування операторів в Oracle", а не включати весняний завантажувач REST і все інше. docs.oracle.com/cd/B19306_01/java.102/b14355/…
Олександр Петров

@AlexandarPetrov: Привіт, я тут ОП. Я видалив частину REST. Мені потрібні властивості конфігурації для Oracle 11/12 за допомогою ojdbc7.jar
anjanb

0
  • Увімкнути кешування оператора через

oracleDataSource.setImplicitCachingEnabled(true)

  • Виберіть правильний розмір кешу, щоб найкраще використовувати пам'ять

connection.setStatementCacheSize(10) Постарайтеся наблизитись до кількості найбільш використовуваних висловлювань Розмір кешу операторів за замовчуванням - 10

  • Резервний, якщо ви не можете змінити програму, щоб використовувати кешування операторів

session_cached_cursors = 50 Connection.setStatementCacheSize(10)


У мене немає доступу до OracleDatasource. Все, що у мене є, - це JdbcTemplate, з якого я отримаю джерело даних Hikari. Я також не переходжу до рівня підключення - я працюю на рівні JdbcTemplate.
anjanb

0

Почніть з перевірки документації, щоб переконатися, що ваша ojdbc8.jarверсія відповідає серверу бази даних. Існують різні версії ojdbc8.jarдля 11g, 11gR2, 12c.

Відповідно до цієї відповіді , вам потрібно oracle.jdbc.implicitStatementCacheSizeвстановити властивість у драйвері JDBC. У цій статті згадується ще кілька властивостей драйвера JDBC, наприклад, oracle.jdbc.freeMemoryOnEnterImplicitCacheабо oracle.jdbc.maxCachedBufferSize. Потрібно перевірити документи на свою версію драйвера, щоб підтвердити наявність цих властивостей.

Це можна передати за допомогою spring.datasource.hikari.data-source-propertiesопції Spring Boot HikariCP . Документи подвійної перевірки на вашу версію Spring Boot, цю властивість було перейменовано хоча б один раз:

застосування.ямл

spring:
  datasource:
    hikari:
      data-source-properties:
        oracle.jdbc.implicitStatementCacheSize: 100  

застосування.властивості

spring.datasource.hikari.data-source-properties.oracle.jdbc.implicitStatementCacheSize: 100 

Можливо, вам також буде цікавий розмір завантаження висловлювань, але ця оптимізація зазвичай застосовується до кожного оператора окремо.


Привіт @Karol, спасибі Як би я перефразував ці властивості за допомогою файла application.properties замість файла application.yml?
anjanb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.