Oracle JDBC Optimization: Mengaktifkan caching PreparedStatement dalam Aplikasi boot Musim Semi


9

Saya memiliki aplikasi Spring Boot REST yang terhubung ke database Oracle. Kami menggunakan JDBC menggunakan JdbcTemplate. Properti basis data Oracle diperoleh melalui 3 pengaturan properti aplikasi :

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

Aplikasi ini menggunakan HikariCP. Dari situs web HikariCP, saya mengetahui bahwa kumpulan ini tidak men-cache PreparedStatements karena driver JDBC adalah pengaturan terbaik untuk melakukan itu.

Sekarang, di mana dan apa yang akan saya tentukan untuk memastikan ini:

  1. Itu Driver Oracle JDBC (ojdbc7.jar) cache PreparedStatements. Apakah ada cara untuk menyesuaikan jumlah PreparedStatements yang dapat di-cache.

  2. Dari https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/ , kita melihat bahwa

    Pastikan bahwa database Anda diatur ke ukuran paket maksimum dan bahwa driver cocok dengan ukuran paket itu. Untuk mengambil set hasil yang lebih besar, ini mengurangi jumlah paket total yang dikirim / diterima antara driver dan server.

Untuk mencapai hal-hal di atas, langkah-langkah apa yang harus dilakukan

  1. temukan ukuran paket Oracle DB Server
  2. temukan apakah Oracle DB Server diatur ke ukuran paket maksimum
  3. temukan atur ukuran paket driver Oracle JDBC (ojdbc8.jar).

Tip pengoptimalan kinerja JDBC (Oracle) lainnya akan dihargai.


Apakah lebih cocok untuk bertanya di situs dba? dba.stackexchange.com/questions/tagged/oracle
user7294900

2
@ user7294900 Tidak juga, karena ini adalah tentang mengkonfigurasi driver JDBC (dengan asumsi bahkan memiliki opsi konfigurasi seperti itu), yang menjadikan ini pertanyaan pemrograman dan bukan pertanyaan DBA.
Mark Rotteveel

Jawaban:


2

Hai fungsi Aktifkan pernyataan Caching pernyataan tidak ada hubungannya dengan Spring, tidak dengan REST. Fungsi ini adalah masalah negosiasi hanya antara sumber data Anda, driver JDBC Anda dan database Anda. Untuk mengetahui cara mengaturnya baca dokumentasi yang relevan tentang driver, sumber data, dan basis data Anda.

Ketika datang ke Hikari, cara yang benar untuk melakukan ini adalah (perhatikan dataource2 , ganti nama menjadi sumber data untuk mengaktifkan konfigurasi otomatis):

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

Properti di dalam konfigurasi Anda akan diteruskan langsung ke driver yang mendasarinya.

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

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


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

}

Contoh ini menggunakan inisialisasi manual dari sumber data yang mendasarinya.


Ini adalah konfigurasi MySQL, cachePrepStmtsadalah opsi driver MySQL JDBC lihat github.com/brettwooldridge/HikariCP/blob/… dan dev.mysql.com/doc/connector-j/5.1/en/…
Karol Dowbecki

@KarolDowbecki sebenarnya contoh ini berjalan pada DB2 :)
Alexandar Petrov

Intinya adalah data-source-propertiesproxy, ia meneruskan properti ke driver sehingga jika driver tidak memiliki cachePrepStmtsproperti itu tidak akan berfungsi. Driver ojdbc8 tidak memiliki properti ini.
Karol Dowbecki

@ KarolDowbecki mungkin Anda harus mengubah pertanyaan kemudian ke "Properti apa yang Anda butuhkan untuk mengaktifkan caching pernyataan di Oracle" daripada melibatkan REST booting semi dan apa pun. docs.oracle.com/cd/B19306_01/java.102/b14355/…
Alexandar Petrov

@AlexandarPetrov: Hai, saya OP di sini. Saya menghapus bagian REST. Saya membutuhkan properti konfigurasi untuk Oracle 11/12 menggunakan ojdbc7.jar
anjanb

0
  • Aktifkan caching Pernyataan melalui

oracleDataSource.setImplicitCachingEnabled(true)

  • Pilih ukuran cache yang tepat untuk memanfaatkan memori dengan baik

connection.setStatementCacheSize(10) Cobalah untuk lebih dekat dengan jumlah pernyataan yang paling sering digunakan Ukuran cache pernyataan standar adalah 10

  • Fallback jika Anda tidak dapat mengubah aplikasi untuk menggunakan caching pernyataan

session_cached_cursors = 50 Connection.setStatementCacheSize(10)


Saya tidak memiliki akses ke OracleDatasource. Yang saya punya akses adalah JdbcTemplate dari mana saya akan mendapatkan sumber data Hikari. Saya juga tidak pergi ke tingkat koneksi - Saya bekerja di tingkat JdbcTemplate.
anjanb

0

Mulailah dengan memeriksa dokumentasi untuk memastikan bahwa Anda ojdbc8.jarcocok dengan versi server database. Ada beberapa versi ojdbc8.jaruntuk 11g, 11gR2, 12c.

Sesuai jawaban ini , Anda perlu oracle.jdbc.implicitStatementCacheSizeproperti diatur dalam driver JDBC. Artikel ini menyebutkan beberapa properti driver JDBC misalnya oracle.jdbc.freeMemoryOnEnterImplicitCacheatau oracle.jdbc.maxCachedBufferSize. Anda perlu memeriksa dokumen untuk versi driver Anda untuk mengonfirmasi bahwa properti ini tersedia.

Ini dapat diteruskan menggunakan spring.datasource.hikari.data-source-propertiesopsi Spring Boot HikariCP . Periksa dokumen untuk versi Boot Musim Semi Anda, properti ini diganti namanya setidaknya sekali:

application.yaml

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

properti aplikasi

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

Anda mungkin juga tertarik dengan ukuran pengambilan pernyataan tetapi optimasi ini biasanya diterapkan untuk setiap pernyataan secara terpisah.


Hai @Karol, terima kasih. Bagaimana saya mengulangi properti ini menggunakan file application.properties alih-alih file application.yml?
anjanb
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.