Оптимизация JDBC Oracle: включить кэширование PreparedStatement в загрузочном приложении 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. Что драйвер JDBC Oracle (ojdbc7.jar) кэширует PreparedStatements. Есть ли способ настроить количество PreparedStatements, которые он может кэшировать.

  2. Из https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/ мы видим, что

    Убедитесь, что в вашей базе данных установлен максимальный размер пакета и что драйвер соответствует этому размеру пакета. Для выборки больших наборов результатов это уменьшает общее количество пакетов, отправленных / полученных между драйвером и сервером.

В соответствии с вышесказанным, какие шаги необходимы для

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

Любой другой (Oracle) совет по оптимизации производительности JDBC приветствуется.


Уместнее спросить на сайте dba? dba.stackexchange.com/questions/tagged/oracle
user7294900

2
@ user7294900 Не совсем, потому что речь идет о настройке драйвера JDBC (при условии, что у него даже есть такая опция конфигурации), что делает это вопросом программирования, а не вопросом DBA.
Марк Роттвил

Ответы:


2

Привет, функция Enable Prepared. Кэширование операторов не имеет ничего общего ни с Spring, ни с REST. Эта функция является вопросом согласования только между вашим источником данных, вашим драйвером JDBC и вашей базой данных. Чтобы узнать, как его настроить, прочтите соответствующую документацию о вашем драйвере, источнике данных и базе данных.

Когда дело доходит до Hikari, это можно сделать следующим образом (обратите внимание на источник данных2 , переименуйте в источник данных, чтобы включить автоконфигурацию):

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/en/…
Кароль Доубеки

@KarolDowbecki на самом деле этот пример был запущен на DB2 :)
Александр Петров

Point is data-source-propertiesproxy, он передает свойства драйверу, поэтому, если у драйвера нет cachePrepStmtsсвойства, он не будет работать. Драйвер ojdbc8 не имеет этих свойств.
Кароль Доубеки

@KarolDowbecki, возможно, вам следует сменить вопрос на «Какое свойство вам нужно, чтобы включить кэширование операторов в Oracle», вместо того, чтобы задействовать REST с весенней загрузкой и т. docs.oracle.com/cd/B19306_01/java.102/b14355/…
Александар Петров

@AlexandarPetrov: Привет, я ОП здесь. Я удалил часть ОТДЫХА. Мне нужны были свойства конфигурации для 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, это свойство было переименовано хотя бы один раз:

application.yaml

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

application.properties

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

Возможно, вас также заинтересует размер выборки операторов, но эта оптимизация обычно применяется к каждому оператору отдельно.


Привет @Karol, спасибо. Как бы я перефразировал эти свойства, используя файл application.properties вместо файла application.yml?
19
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.