Optimisation JDBC Oracle: activez la mise en cache PreparedStatement dans une application Spring Boot

9

J'ai une application Spring Boot REST connectée à une base de données Oracle. Nous utilisons JDBC en utilisant JdbcTemplate. Les propriétés de la base de données Oracle sont obtenues via ces 3 paramètres application.properties :

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

Cette application utilise le HikariCP. Sur le site Web HikariCP, j'ai appris que ce pool ne met pas en cache PreparedStatements car le pilote JDBC est le mieux configuré pour le faire.

Maintenant, où et que devrais-je spécifier pour garantir ces:

  1. Que le pilote Oracle JDBC (ojdbc7.jar) met en cache PreparedStatements. Existe-t-il un moyen de personnaliser le nombre de PreparedStatements qu'il peut mettre en cache.

  2. Sur https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/ , nous constatons que

    Assurez-vous que votre base de données est définie sur la taille de paquet maximale et que le pilote correspond à cette taille de paquet. Pour récupérer des jeux de résultats plus volumineux, cela réduit le nombre total de paquets envoyés / reçus entre le pilote et le serveur.

Conformément à ce qui précède, quelles sont les étapes nécessaires pour

  1. trouver la taille du paquet Oracle DB Server
  2. rechercher si Oracle DB Server est défini sur la taille de paquet maximale
  3. find définit la taille de paquet (ojdbc8.jar) du pilote Oracle JDBC.

Tout autre conseil (Oracle) d'optimisation des performances JDBC serait apprécié.

anjanb
la source
Est-il plus approprié de demander dans le site dba? dba.stackexchange.com/questions/tagged/oracle
user7294900
2
@ user7294900 Pas vraiment, car il s'agit de configurer le pilote JDBC (en supposant qu'il dispose même d'une telle option de configuration), ce qui en fait une question de programmation et non une question DBA.
Mark Rotteveel

Réponses:

2

Salut la fonction Activer la mise en cache des instructions préparées n'a rien à voir ni avec Spring, ni avec REST. Cette fonction est une question de négociation uniquement entre votre source de données, votre pilote JDBC et votre base de données. Pour savoir comment le configurer, lisez la documentation pertinente sur votre pilote, votre source de données et votre base de données.

En ce qui concerne Hikari, la meilleure façon de le faire est (notez datasource2 , renommer en datasource pour activer l'autoconfiguration):

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

Les propriétés à l'intérieur de votre configuration seront transmises directement au pilote sous-jacent.

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

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


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

}

Cet exemple utilise l'initialisation manuelle de la source de données sous-jacente.

Alexandar Petrov
la source
Ceci est une configuration MySQL, cachePrepStmtsest une option de pilote JDBC MySQL voir github.com/brettwooldridge/HikariCP/blob/… et dev.mysql.com/doc/connector-j/5.1/en/…
Karol Dowbecki
@KarolDowbecki actuellement cet exemple était en cours d'exécution sur DB2 :)
Alexandar Petrov
Le point est data-source-propertiesun proxy, il transmet des propriétés au pilote, donc si le pilote n'a pas de cachePrepStmtspropriété, cela ne fonctionnera pas. Le pilote ojdbc8 n'a pas ces propriétés.
Karol Dowbecki
@KarolDowbecki peut-être devriez-vous alors changer la question en "De quelle propriété avez-vous besoin afin d'activer la mise en cache des instructions dans Oracle" au lieu d'impliquer Spring Boot REST et autre. docs.oracle.com/cd/B19306_01/java.102/b14355/…
Alexandar Petrov
@AlexandarPetrov: Salut, je suis l'OP ici. J'ai retiré la partie REST. J'avais besoin des propriétés de configuration pour Oracle 11/12 en utilisant ojdbc7.jar
anjanb
0
  • Activer la mise en cache des instructions via

oracleDataSource.setImplicitCachingEnabled(true)

  • Choisissez la bonne taille de cache pour utiliser au mieux la mémoire

connection.setStatementCacheSize(10) Essayez de vous rapprocher du nombre d'instructions les plus utilisées. La taille par défaut du cache d'instructions est de 10.

  • Remplacement si vous ne pouvez pas modifier l'application pour utiliser la mise en cache des instructions

session_cached_cursors = 50 Connection.setStatementCacheSize(10)

Nirmala
la source
Je n'ai pas accès à OracleDatasource. Tout ce que j'ai accès est le JdbcTemplate à partir duquel j'obtiendrai la source de données Hikari. Je ne vais pas non plus au niveau de la connexion - je travaille au niveau JdbcTemplate.
anjanb
0

Commencez par vérifier la documentation pour vous assurer que votre ojdbc8.jarcorrespond à la version du serveur de base de données. Il existe différentes versions de ojdbc8.jarpour 11g, 11gR2, 12c.

Selon cette réponse , vous devez oracle.jdbc.implicitStatementCacheSizedéfinir une propriété dans le pilote JDBC. Cet article mentionne quelques autres propriétés de pilote JDBC, par exemple oracle.jdbc.freeMemoryOnEnterImplicitCacheou oracle.jdbc.maxCachedBufferSize. Vous devez vérifier la documentation de votre version de pilote pour confirmer que ces propriétés sont disponibles.

Cela peut être transmis à l'aide de l' spring.datasource.hikari.data-source-propertiesoption Spring Boot HikariCP . Vérifiez la documentation de votre version Spring Boot, cette propriété a été renommée au moins une fois:

application.yaml

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

application.properties

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

Vous pouvez également être intéressé par la taille d'extraction des instructions, mais cette optimisation est généralement appliquée à chaque instruction séparément.

Karol Dowbecki
la source
Salut @ Karol, merci. Comment reformuler ces propriétés en utilisant le fichier application.properties au lieu d'un fichier application.yml?
anjanb