У меня есть приложение Spring Boot REST, которое подключено к базе данных Oracle. Мы используем JDBC, используя JdbcTemplate. Свойства базы данных Oracle получаются через эти 3 настройки application.properties :
spring.datasource.url
spring.datasource.username
spring.datasource.password
Это приложение использует HikariCP. С веб-сайта HikariCP я узнал, что этот пул не кэширует PreparedStatements, потому что драйвер JDBC лучше всего подходит для этого.
Теперь, где и что бы я указал, чтобы обеспечить это:
Что драйвер JDBC Oracle (ojdbc7.jar) кэширует PreparedStatements. Есть ли способ настроить количество PreparedStatements, которые он может кэшировать.
Из https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/ мы видим, что
Убедитесь, что в вашей базе данных установлен максимальный размер пакета и что драйвер соответствует этому размеру пакета. Для выборки больших наборов результатов это уменьшает общее количество пакетов, отправленных / полученных между драйвером и сервером.
В соответствии с вышесказанным, какие шаги необходимы для
- найти размер пакета Oracle DB Server
- определить, установлен ли для Oracle DB Server максимальный размер пакета
- find установить размер пакета драйвера JDBC Oracle (ojdbc8.jar).
Любой другой (Oracle) совет по оптимизации производительности JDBC приветствуется.
Ответы:
Привет, функция Enable Prepared. Кэширование операторов не имеет ничего общего ни с Spring, ни с REST. Эта функция является вопросом согласования только между вашим источником данных, вашим драйвером JDBC и вашей базой данных. Чтобы узнать, как его настроить, прочтите соответствующую документацию о вашем драйвере, источнике данных и базе данных.
Когда дело доходит до Hikari, это можно сделать следующим образом (обратите внимание на источник данных2 , переименуйте в источник данных, чтобы включить автоконфигурацию):
Свойства внутри вашей конфигурации будут переданы непосредственно основному драйверу.
}
В этом примере используется ручная инициализация базового источника данных.
источник
cachePrepStmts
это вариант драйвера MySQL JDBC, см. Github.com/brettwooldridge/HikariCP/blob/… и dev.mysql.com/doc/connector-j/5.1/en/…data-source-properties
proxy, он передает свойства драйверу, поэтому, если у драйвера нетcachePrepStmts
свойства, он не будет работать. Драйвер ojdbc8 не имеет этих свойств.oracleDataSource.setImplicitCachingEnabled(true)
connection.setStatementCacheSize(10)
Попробуйте быть ближе к числу наиболее часто используемых операторов. Размер кэша операторов по умолчанию равен 10.session_cached_cursors = 50 Connection.setStatementCacheSize(10)
источник
Начните с проверки документации, чтобы убедиться, что она
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
application.properties
Возможно, вас также заинтересует размер выборки операторов, но эта оптимизация обычно применяется к каждому оператору отдельно.
источник