Ottimizzazione JDBC Oracle: abilitare la memorizzazione nella cache PreparedStatement in un'applicazione di avvio Spring


9

Ho un'applicazione REST di Spring Boot collegata a un database Oracle. Stiamo usando JDBC usando JdbcTemplate. Le proprietà del database Oracle si ottengono tramite queste 3 impostazioni application.properties :

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

Questa applicazione utilizza HikariCP. Dal sito Web HikariCP, sono venuto a sapere che questo pool non memorizza nella cache PreparedStatements perché il driver JDBC è la migliore configurazione per farlo.

Ora, dove e cosa dovrei specificare per garantire questi:

  1. Che il driver Oracle JDBC (ojdbc7.jar) memorizzi nella cache PreparedStatements. C'è un modo per personalizzare il numero di PreparedStatements che può memorizzare nella cache.

  2. Da https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/ , vediamo che

    Assicurarsi che il database sia impostato sulla dimensione massima del pacchetto e che il driver corrisponda a tale dimensione del pacchetto. Per recuperare set di risultati più grandi, ciò riduce il numero di pacchetti totali inviati / ricevuti tra il driver e il server.

Ai sensi di quanto sopra, quali sono i passaggi necessari

  1. trova la dimensione del pacchetto Oracle DB Server
  2. trova se Oracle DB Server è impostato sulla dimensione massima del pacchetto
  3. find imposta la dimensione del pacchetto del driver Oracle JDBC (ojdbc8.jar).

Qualsiasi altro suggerimento per l'ottimizzazione delle prestazioni (Oracle) JDBC sarebbe apprezzato.


È più adatto chiedere nel sito dba? dba.stackexchange.com/questions/tagged/oracle
user7294900

2
@ user7294900 Non proprio, perché si tratta di configurare il driver JDBC (supponendo che abbia anche una tale opzione di configurazione), il che rende questa una domanda di programmazione e non una domanda DBA.
Mark Rotteveel

Risposte:


2

Salve la funzione Abilita memorizzazione nella cache delle istruzioni preparate non ha nulla a che fare con Spring, né con REST. Questa funzione è una questione di negoziazione solo tra l'origine dati, il driver JDBC e il database. Per scoprire come configurarlo, leggere la documentazione pertinente su driver, origine dati e database.

Quando si tratta di Hikari, il modo coirrect per farlo è (notate datasource2 , rinominate in datasource per abilitare la configurazione automatica):

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

Le proprietà all'interno della configurazione verranno passate direttamente al driver sottostante.

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

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


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

}

In questo esempio viene utilizzata l'inizializzazione manuale dell'origine dati sottostante.


Questa è la configurazione di MySQL, cachePrepStmtsè un'opzione del driver JDBC di MySQL, vedi github.com/brettwooldridge/HikariCP/blob/… e dev.mysql.com/doc/connector-j/5.1/en/…
Karol Dowbecki

@KarolDowbecki in realtà questo esempio era in esecuzione su DB2 :)
Alexandar Petrov,

Point is data-source-propertiesè un proxy, passa le proprietà al driver, quindi se il driver non ha cachePrepStmtsproprietà non funzionerà. Il driver ojdbc8 non ha queste proprietà.
Karol Dowbecki,

@KarolDowbecki forse dovresti cambiare la domanda quindi in "Di quale proprietà hai bisogno per abilitare la cache delle istruzioni in Oracle" invece di coinvolgere Spring Boot REST e quant'altro. docs.oracle.com/cd/B19306_01/java.102/b14355/…
Alexandar Petrov

@AlexandarPetrov: Ciao, sono l'OP qui. Ho rimosso la parte REST. Avevo bisogno delle proprietà di configurazione per Oracle 11/12 usando ojdbc7.jar
anjanb

0
  • Abilita la memorizzazione nella cache delle istruzioni

oracleDataSource.setImplicitCachingEnabled(true)

  • Scegli la dimensione della cache corretta per utilizzare al meglio la memoria

connection.setStatementCacheSize(10) Cerca di avvicinarti al numero di istruzioni più utilizzate La dimensione della cache delle istruzioni predefinita è 10

  • Fallback se non è possibile modificare l'applicazione per utilizzare la cache delle istruzioni

session_cached_cursors = 50 Connection.setStatementCacheSize(10)


Non ho accesso a OracleDatasource. Tutto quello a cui ho accesso è il JdbcTemplate da cui otterrò l'origine dati Hikari. Inoltre non vado al livello di connessione - lavoro a livello di JdbcTemplate.
Anjanb,

0

Inizia controllando la documentazione per assicurarti che ojdbc8.jarcorrisponda alla versione del server di database. Esistono diverse versioni di ojdbc8.jarper 11g, 11gR2, 12c.

In base a questa risposta , è necessario oracle.jdbc.implicitStatementCacheSizeimpostare la proprietà nel driver JDBC. Questo articolo menziona alcune proprietà del driver JDBC, ad esempio oracle.jdbc.freeMemoryOnEnterImplicitCacheo oracle.jdbc.maxCachedBufferSize. È necessario controllare i documenti per la versione del driver per confermare che queste proprietà sono disponibili.

Questo può essere passato usando Spring Boot HikariCP spring.datasource.hikari.data-source-properties opzione . Ricontrolla i documenti per la tua versione di Spring Boot, questa proprietà è stata rinominata almeno una volta:

application.yaml

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

application.properties

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

Potresti anche essere interessato alla dimensione di recupero dell'istruzione, ma questa ottimizzazione viene solitamente applicata a ciascuna istruzione separatamente.


Ciao @Karol, grazie. Come potrei riformulare queste proprietà usando il file application.properties anziché un file application.yml?
anjanb
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.