Ich habe eine Spring Boot REST-Anwendung, die mit einer Oracle-Datenbank verbunden ist. Wir verwenden JDBC mit JdbcTemplate. Die Oracle-Datenbankeigenschaften werden über diese drei Einstellungen von application.properties abgerufen :
spring.datasource.url
spring.datasource.username
spring.datasource.password
Diese Anwendung verwendet das HikariCP. Auf der HikariCP-Website habe ich erfahren, dass dieser Pool PreparedStatements nicht zwischenspeichert, da der JDBC-Treiber dafür am besten geeignet ist.
Wo und was würde ich jetzt angeben, um dies sicherzustellen:
Dass der Oracle JDBC-Treiber (ojdbc7.jar) PreparedStatements zwischenspeichert. Gibt es eine Möglichkeit, die Anzahl der PreparedStatements anzupassen, die zwischengespeichert werden können?
Unter https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/ sehen wir das
Stellen Sie sicher, dass Ihre Datenbank auf die maximale Paketgröße eingestellt ist und der Treiber dieser Paketgröße entspricht. Durch das Abrufen größerer Ergebnismengen wird die Anzahl der insgesamt zwischen Treiber und Server gesendeten / empfangenen Pakete verringert.
Welche Schritte sind erforderlich, um das oben Gesagte zu erreichen?
- Suchen Sie die Oracle DB Server-Paketgröße
- Finden Sie heraus, ob der Oracle DB Server auf die maximale Paketgröße eingestellt ist
- find Legen Sie die Paketgröße des Oracle JDBC-Treibers (ojdbc8.jar) fest.
Jeder andere (Oracle) JDBC-Tipp zur Leistungsoptimierung wäre willkommen.
Antworten:
Hallo, die Funktion Enable Prepared Statement Caching hat weder mit Spring noch mit REST etwas zu tun. Diese Funktion ist nur eine Frage der Aushandlung zwischen Ihrer Datenquelle, Ihrem JDBC-Treiber und Ihrer Datenbank. Um herauszufinden, wie es eingerichtet wird, lesen Sie die entsprechende Dokumentation zu Ihrem Treiber, Ihrer Datenquelle und Ihrer Datenbank.
Wenn es um Hikari geht, ist der richtige Weg, dies zu tun (beachten Sie Datenquelle2 , benennen Sie in Datenquelle um , um die automatische Konfiguration zu aktivieren):
Die Eigenschaften in Ihrer Konfiguration werden direkt an den zugrunde liegenden Treiber übergeben.
}}
In diesem Beispiel wird die manuelle Initialisierung der zugrunde liegenden Datenquelle verwendet.
quelle
cachePrepStmts
eine MySQL-JDBC- Treiberoption, siehe github.com/brettwooldridge/HikariCP/blob/… und dev.mysql.com/doc/connector-j/5.1/en/…data-source-properties
ein Proxy, er übergibt Eigenschaften an den Treiber. Wenn der Treiber keinecachePrepStmts
Eigenschaft hat, funktioniert dies nicht. Der ojdbc8-Treiber verfügt nicht über diese Eigenschaften.oracleDataSource.setImplicitCachingEnabled(true)
connection.setStatementCacheSize(10)
Versuchen Sie, näher an der Anzahl der am häufigsten verwendeten Anweisungen zu sein. Die Standardgröße für den Anweisungscache beträgt 10session_cached_cursors = 50 Connection.setStatementCacheSize(10)
quelle
Überprüfen Sie zunächst die Dokumentation, um sicherzustellen, dass Ihre
ojdbc8.jar
mit der Datenbankserverversion übereinstimmt. Es gibt verschiedene Versionen vonojdbc8.jar
für 11g, 11gR2, 12c.Gemäß dieser Antwort muss die
oracle.jdbc.implicitStatementCacheSize
Eigenschaft im JDBC-Treiber festgelegt werden. In diesem Artikel werden einige weitere JDBC-Treibereigenschaften erwähnt, z . B.oracle.jdbc.freeMemoryOnEnterImplicitCache
oderoracle.jdbc.maxCachedBufferSize
. Sie müssen die Dokumente für Ihre Treiberversion überprüfen, um zu bestätigen, dass diese Eigenschaften verfügbar sind.Dies kann mit der Spring Boot HikariCP-
spring.datasource.hikari.data-source-properties
Option übergeben werden. Überprüfen Sie die Dokumente für Ihre Spring Boot-Version. Diese Eigenschaft wurde mindestens einmal umbenannt:application.yaml
application.properties
Möglicherweise interessieren Sie sich auch für die Abrufgröße von Anweisungen , diese Optimierung wird jedoch normalerweise für jede Anweisung separat angewendet.
quelle