Oracle JDBC-Optimierung: Aktivieren Sie das PreparedStatement-Caching in einer Spring-Boot-Anwendung

9

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:

  1. Dass der Oracle JDBC-Treiber (ojdbc7.jar) PreparedStatements zwischenspeichert. Gibt es eine Möglichkeit, die Anzahl der PreparedStatements anzupassen, die zwischengespeichert werden können?

  2. 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?

  1. Suchen Sie die Oracle DB Server-Paketgröße
  2. Finden Sie heraus, ob der Oracle DB Server auf die maximale Paketgröße eingestellt ist
  3. find Legen Sie die Paketgröße des Oracle JDBC-Treibers (ojdbc8.jar) fest.

Jeder andere (Oracle) JDBC-Tipp zur Leistungsoptimierung wäre willkommen.

anjanb
quelle
Ist es besser, in dba site zu fragen? dba.stackexchange.com/questions/tagged/oracle
user7294900
2
@ user7294900 Nicht wirklich, da es um die Konfiguration des JDBC-Treibers geht (vorausgesetzt, er verfügt sogar über eine solche Konfigurationsoption), was dies zu einer Programmierfrage und nicht zu einer DBA-Frage macht.
Mark Rotteveel

Antworten:

2

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):

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

Die Eigenschaften in Ihrer Konfiguration werden direkt an den zugrunde liegenden Treiber übergeben.

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

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


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

}}

In diesem Beispiel wird die manuelle Initialisierung der zugrunde liegenden Datenquelle verwendet.

Alexandar Petrov
quelle
Dies ist eine MySQL-Konfiguration, cachePrepStmtseine MySQL-JDBC- Treiberoption, siehe github.com/brettwooldridge/HikariCP/blob/… und dev.mysql.com/doc/connector-j/5.1/en/…
Karol Dowbecki
@ KarolDowbecki tatsächlich lief dieses Beispiel auf DB2 :)
Alexandar Petrov
Punkt ist data-source-propertiesein Proxy, er übergibt Eigenschaften an den Treiber. Wenn der Treiber keine cachePrepStmtsEigenschaft hat, funktioniert dies nicht. Der ojdbc8-Treiber verfügt nicht über diese Eigenschaften.
Karol Dowbecki
@KarolDowbecki Vielleicht sollten Sie die Frage dann in "Welche Eigenschaft benötigen Sie, um das Zwischenspeichern von Anweisungen in Oracle zu aktivieren" ändern, anstatt Spring Boot REST und was auch immer einzubeziehen. docs.oracle.com/cd/B19306_01/java.102/b14355/…
Alexandar Petrov
@AlexandarPetrov: Hallo, ich bin der OP hier. Ich habe den REST-Teil entfernt. Ich brauchte die Konfigurationseigenschaften für Oracle 11/12 mit ojdbc7.jar
anjanb
0
  • Aktivieren Sie das Zwischenspeichern von Anweisungen

oracleDataSource.setImplicitCachingEnabled(true)

  • Wählen Sie die richtige Cache-Größe, um den Speicher optimal zu nutzen

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 10

  • Fallback, wenn Sie die Anwendung nicht ändern können, um das Zwischenspeichern von Anweisungen zu verwenden

session_cached_cursors = 50 Connection.setStatementCacheSize(10)

Nirmala
quelle
Ich habe keinen Zugriff auf die OracleDatasource. Ich habe nur Zugriff auf die JdbcTemplate, von der ich die Hikari-Datenquelle erhalten werde. Ich gehe auch nicht zur Verbindungsebene - ich arbeite auf der JdbcTemplate-Ebene.
Anjanb
0

Überprüfen Sie zunächst die Dokumentation, um sicherzustellen, dass Ihre ojdbc8.jarmit der Datenbankserverversion übereinstimmt. Es gibt verschiedene Versionen von ojdbc8.jarfür 11g, 11gR2, 12c.

Gemäß dieser Antwort muss die oracle.jdbc.implicitStatementCacheSizeEigenschaft im JDBC-Treiber festgelegt werden. In diesem Artikel werden einige weitere JDBC-Treibereigenschaften erwähnt, z . B. oracle.jdbc.freeMemoryOnEnterImplicitCacheoder oracle.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-propertiesOption übergeben werden. Überprüfen Sie die Dokumente für Ihre Spring Boot-Version. Diese Eigenschaft wurde mindestens einmal umbenannt:

application.yaml

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

application.properties

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

Möglicherweise interessieren Sie sich auch für die Abrufgröße von Anweisungen , diese Optimierung wird jedoch normalerweise für jede Anweisung separat angewendet.

Karol Dowbecki
quelle
Hallo @Karol, danke. Wie würde ich diese Eigenschaften mithilfe der Datei application.properties anstelle einer Datei application.yml umformulieren?
Anjanb