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ć:
Sterownik Oracle JDBC (ojdbc7.jar) buforuje PreparedStatements. Czy istnieje sposób na dostosowanie liczby PreparedStatements, które może buforować.
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ć
- znajdź rozmiar pakietu Oracle DB Server
- sprawdź, czy Oracle DB Server jest ustawiony na maksymalny rozmiar pakietu
- znajdź ustaw rozmiar pakietu sterownika JDBC Oracle (ojdbc8.jar).
Doceniamy każdą inną wskazówkę dotyczącą optymalizacji wydajności JDBC (Oracle).
Odpowiedzi:
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ę):
Właściwości w konfiguracji zostaną przekazane bezpośrednio do podstawowego sterownika.
}
W tym przykładzie użyto ręcznej inicjalizacji bazowego źródła danych.
źródło
cachePrepStmts
jest to opcja sterownika JDBC MySQL, patrz github.com/brettwooldridge/HikariCP/blob/… i dev.mysql.com/doc/connector-j/5.1/en/…data-source-properties
proxy, przekazuje właściwości do sterownika, więc jeśli sterownik nie macachePrepStmts
właściwości, nie będzie działać. Sterownik ojdbc8 nie ma tych właściwości.oracleDataSource.setImplicitCachingEnabled(true)
connection.setStatementCacheSize(10)
Staraj się być bliżej liczby najczęściej używanych instrukcji Domyślny rozmiar pamięci podręcznej instrukcji wynosi 10session_cached_cursors = 50 Connection.setStatementCacheSize(10)
źródło
Zacznij od sprawdzenia dokumentacji, aby upewnić się, że
ojdbc8.jar
pasuje do wersji serwera bazy danych. Istnieją różne wersjeojdbc8.jar
dla 11g, 11gR2, 12c.Jak na tej odpowiedzi , trzeba
oracle.jdbc.implicitStatementCacheSize
właściwość należy ustawić w sterowniku JDBC. W tym artykule wspomniano o kilku dodatkowych właściwościach sterownika JDBC, np .oracle.jdbc.freeMemoryOnEnterImplicitCache
Luboracle.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-properties
opcji HikariCP Spring Boot . Dokładnie sprawdź dokumenty dla swojej wersji Spring Boot, ta właściwość została przemianowana co najmniej raz:application.yaml
application.properties
Możesz również być zainteresowany wielkością pobierania instrukcji, ale ta optymalizacja jest zwykle stosowana do każdej instrukcji osobno.
źródło