web-dev-qa-db-fra.com

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

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

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

Cette application utilise le HikariCP. À partir du 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. De https://howtodoinjava.com/Java/jdbc/best-practices-to-improve-jdbc-performance/ , nous voyons 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 du pilote Oracle JDBC (ojdbc8.jar).

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

9
anjanb

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 procéder est (remarque datasource2, renommer datasource pour activer la configuration automatique):

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.

2
Alexandar Petrov

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

Selon cette réponse , vous avez besoin de Oracle.jdbc.implicitStatementCacheSize propriété à définir dans le pilote JDBC. Cet article mentionne quelques autres propriétés de pilote JDBC, par exemple Oracle.jdbc.freeMemoryOnEnterImplicitCache ou 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 passé en utilisant Spring Boot HikariCP spring.datasource.hikari.data-source-properties option. 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 pourriez également être intéressé par taille de récupération de l'instruction mais cette optimisation est généralement appliquée à chaque instruction séparément.

0
Karol Dowbecki
  • 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 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)

0
Nirmala