Optymalizacja JDBC Oracle: Włącz buforowanie PreparedStatement w aplikacji Spring boot

9

Mam aplikację REST Spring Boot połączoną z bazą danych Oracle. Używamy JDBC za pomocą JdbcTemplate. Właściwości bazy danych Oracle są uzyskiwane za pomocą następujących 3 ustawień application.properties :

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

Ta aplikacja korzysta z HikariCP. Z witryny HikariCP dowiedziałem się, że ta pula nie buforuje PreparedStatements, ponieważ sterownik JDBC jest najlepszy do tego celu.

Teraz, gdzie i co chciałbym określić, aby zapewnić:

  1. Sterownik Oracle JDBC (ojdbc7.jar) buforuje PreparedStatements. Czy istnieje sposób na dostosowanie liczby PreparedStatements, które może buforować.

  2. Od https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/ widzimy, że

    Upewnij się, że baza danych jest ustawiona na maksymalny rozmiar pakietu i że sterownik odpowiada temu rozmiarowi pakietu. W przypadku pobierania większych zestawów wyników zmniejsza to całkowitą liczbę pakietów wysłanych / odebranych między sterownikiem a serwerem.

Zgodnie z powyższym, jakie kroki należy wykonać

  1. znajdź rozmiar pakietu Oracle DB Server
  2. sprawdź, czy Oracle DB Server jest ustawiony na maksymalny rozmiar pakietu
  3. znajdź ustaw rozmiar pakietu sterownika JDBC Oracle (ojdbc8.jar).

Doceniamy każdą inną wskazówkę dotyczącą optymalizacji wydajności JDBC (Oracle).

anjanb
źródło
Czy lepiej jest zapytać na stronie dba? dba.stackexchange.com/questions/tagged/oracle
user7294900
2
@ user7294900 Nie bardzo, bo chodzi o konfigurację sterownika JDBC (zakładając, że ma nawet taką opcję konfiguracji), co sprawia, że ​​jest to pytanie programistyczne, a nie pytanie DBA.
Mark Rotteveel

Odpowiedzi:

2

Witaj, funkcja Włącz buforowanie instrukcji Prepared nie ma nic wspólnego z Spring, ani z REST. Ta funkcja jest kwestią negocjacji tylko między źródłem danych, sterownikiem JDBC i bazą danych. Aby dowiedzieć się, jak to skonfigurować, przeczytaj odpowiednią dokumentację dotyczącą sterownika, źródła danych i bazy danych.

Jeśli chodzi o Hikari, poprawnym sposobem na to jest (zauważ datasource2 , zmień nazwę na dataasource, aby włączyć autokonfigurację):

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

Właściwości w konfiguracji zostaną przekazane bezpośrednio do podstawowego sterownika.

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

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


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

}

W tym przykładzie użyto ręcznej inicjalizacji bazowego źródła danych.

Aleksander Pietrow
źródło
To jest konfiguracja MySQL, cachePrepStmtsjest to opcja sterownika JDBC MySQL, patrz github.com/brettwooldridge/HikariCP/blob/… i dev.mysql.com/doc/connector-j/5.1/en/…
Karol Dowbecki
@KarolDowbecki w rzeczywistości ten przykład działał na DB2 :)
Alexandar Petrov
Punkt jest data-source-propertiesproxy, przekazuje właściwości do sterownika, więc jeśli sterownik nie ma cachePrepStmtswłaściwości, nie będzie działać. Sterownik ojdbc8 nie ma tych właściwości.
Karol Dowbecki
@KarolDowbecki, może powinieneś zmienić pytanie na „Jaką właściwość potrzebujesz, aby włączyć buforowanie instrukcji w Oracle” zamiast angażować Spring REST i cokolwiek innego. docs.oracle.com/cd/B19306_01/java.102/b14355/…
Alexandar Petrov
@AlexandarPetrov: Cześć, jestem tu OP. Usunąłem część REST. Potrzebowałem właściwości konfiguracyjnych dla Oracle 11/12 przy użyciu ojdbc7.jar
anjanb
0
  • Włącz buforowanie instrukcji poprzez

oracleDataSource.setImplicitCachingEnabled(true)

  • Wybierz odpowiedni rozmiar pamięci podręcznej, aby jak najlepiej wykorzystać pamięć

connection.setStatementCacheSize(10) Staraj się być bliżej liczby najczęściej używanych instrukcji Domyślny rozmiar pamięci podręcznej instrukcji wynosi 10

  • Awaryjne, jeśli nie można zmienić aplikacji na buforowanie instrukcji

session_cached_cursors = 50 Connection.setStatementCacheSize(10)

Nirmala
źródło
Nie mam dostępu do OracleDatasource. Mam tylko dostęp do JdbcTemplate, z którego otrzymam źródło danych Hikari. Nie przechodzę też do poziomu połączenia - pracuję na poziomie JdbcTemplate.
anjanb
0

Zacznij od sprawdzenia dokumentacji, aby upewnić się, że ojdbc8.jarpasuje do wersji serwera bazy danych. Istnieją różne wersjeojdbc8.jar dla 11g, 11gR2, 12c.

Jak na tej odpowiedzi , trzeba oracle.jdbc.implicitStatementCacheSizewłaściwość należy ustawić w sterowniku JDBC. W tym artykule wspomniano o kilku dodatkowych właściwościach sterownika JDBC, np . oracle.jdbc.freeMemoryOnEnterImplicitCacheLub oracle.jdbc.maxCachedBufferSize. Musisz sprawdzić dokumenty dla swojej wersji sterownika, aby potwierdzić, że te właściwości są dostępne.

Można to przekazać za pomocą spring.datasource.hikari.data-source-propertiesopcji HikariCP Spring Boot . Dokładnie sprawdź dokumenty dla swojej wersji Spring Boot, ta właściwość została przemianowana co najmniej raz:

application.yaml

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

application.properties

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

Możesz również być zainteresowany wielkością pobierania instrukcji, ale ta optymalizacja jest zwykle stosowana do każdej instrukcji osobno.

Karol Dowbecki
źródło
Cześć @Karol, dzięki. Jak mam zmienić te właściwości przy użyciu pliku application.properties zamiast pliku application.yml?
anjanb