Oracle JDBC Optimizasyonu: Bir Bahar önyükleme Uygulamasında PreparedStatement önbelleğini etkinleştir


9

Oracle veritabanına bağlı bir Spring Boot REST uygulamam var. JDBC'yi JdbcTemplate kullanarak kullanıyoruz. Oracle veritabanı özellikleri şu 3 application.properties ayarıyla elde edilir :

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

Bu uygulama HikariCP kullanıyor. HikariCP web sitesinden, JDBC sürücüsü bunu yapmak için en iyi kurulum olduğundan bu havuzun PreparedStatements'ı önbelleğe almadığını öğrendim.

Şimdi, bunları sağlamak için nerede ve ne belirtirim:

  1. Oracle JDBC Sürücüsü'nün (ojdbc7.jar) PreparedStatements'ı önbelleğe alması. Önbelleğe alabileceği PreparedStatements sayısını özelleştirmenin bir yolu var mı?

  2. Dan https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/ bunu görmek

    Veritabanınızın maksimum paket boyutuna ayarlandığından ve sürücünün bu paket boyutuyla eşleştiğinden emin olun. Daha büyük sonuç kümeleri getirmek için, bu sürücü ve sunucu arasında gönderilen / alınan toplam paket sayısını azaltır.

Yukarıdakilerin peşinde, yapılması gereken adımlar nelerdir?

  1. Oracle DB Server paket boyutunu bulma
  2. Oracle DB Server'ın maksimum paket boyutuna ayarlanıp ayarlanmadığını bulma
  3. Oracle JDBC sürücüsünün (ojdbc8.jar) paket boyutunu ayarlayın.

Başka herhangi bir (Oracle) JDBC performans optimizasyonu ipucu takdir edilecektir.


Dba sitesinde sormak daha uygun mu? dba.stackexchange.com/questions/tagged/oracle
user7294900

2
@ user7294900 Gerçekten değil, çünkü bu JDBC sürücüsünü yapılandırmakla ilgilidir (hatta böyle bir yapılandırma seçeneğine sahip olduğu varsayılarak), bu da bunu bir DBA sorusu değil, bir programlama sorusu yapar.
Mark Rotteveel

Yanıtlar:


2

Merhaba Hazırlık deyimi önbelleğe almayı etkinleştir işlevinin ne Bahar ne de REST ile ilgisi yoktur. Bu işlev yalnızca veri kaynağınız, JDBC sürücünüz ve veritabanınız arasında bir müzakere sorunudur. Nasıl ayarlayacağınızı öğrenmek için sürücünüz, veri kaynağınız ve veritabanınızla ilgili belgeleri okuyun.

Hikari söz konusu olduğunda, bunu yapmanın doğru yolu ( datasource2'ye dikkat edin , otomatik yapılandırmayı etkinleştirmek için veri kaynağına yeniden adlandırın ):

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

Yapılandırmanızın içindeki özellikler doğrudan temel sürücüye aktarılır.

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

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


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

}

Bu örnek, temeldeki veri kaynağının manuel olarak başlatılmasını kullanır.


Bu MySQL yapılandırması, cachePrepStmtsbir MySQL JDBC sürücü seçeneğidir github.com/brettwooldridge/HikariCP/blob/… ve dev.mysql.com/doc/connector-j/5.1/en/… adresini ziyaret edin
Karol Dowbecki

@KarolDowbecki aslında bu örnek DB2 üzerinde çalışıyordu :)
Alexandar Petrov

Nokta data-source-propertiesbir proxy, özellikleri sürücüye iletir, bu nedenle sürücü cachePrepStmtsözelliği yoksa çalışmaz. ojdbc8 sürücüsü bu özelliklere sahip değil.
Karol Dowbecki

@KarolDowbecki belki de bahar önyükleme REST ve her neyse, "Oracle'da deyim önbelleğe almayı etkinleştirmek için hangi özelliğe ihtiyacınız var" sorusunu değiştirmelisiniz. docs.oracle.com/cd/B19306_01/java.102/b14355/…
Alexandar Petrov

@AlexandarPetrov: Merhaba, ben burada OP. REST bölümünü kaldırdım. Oracle 11/12 için ojdbc7.jar kullanarak yapılandırma özelliklerine ihtiyacım vardı
anjanb

0
  • Şununla deyimin önbelleğe alınmasını etkinleştir

oracleDataSource.setImplicitCachingEnabled(true)

  • Belleği en iyi şekilde kullanmak için doğru önbellek boyutunu seçin

connection.setStatementCacheSize(10) En çok kullanılan deyimlerin sayısına daha yakın olmaya çalışın Varsayılan deyim önbellek boyutu 10

  • Deyimi önbelleğe almak için uygulamayı değiştiremezseniz yedek

session_cached_cursors = 50 Connection.setStatementCacheSize(10)


OracleDatasource'a erişimim yok. Tüm erişimi olan Hikari veri kaynağı alacağım JdbcTemplate olduğunu. Ayrıca bağlantı seviyesine gitmiyorum - JdbcTemplate seviyesinde çalışıyorum.
anjanb

0

ojdbc8.jarVeritabanı sunucunuzun sürümüyle eşleştiğinden emin olmak için belgeleri kontrol edin . ojdbc8.jar11g, 11gR2, 12c için farklı versiyonlar vardır .

Gereğince bu cevap , size gereken oracle.jdbc.implicitStatementCacheSizeJDBC sürücüsü ayarlanmasına özellik. Bu makale birkaç JDBC sürücüsü özellikleri örneğin bahseder oracle.jdbc.freeMemoryOnEnterImplicitCacheya oracle.jdbc.maxCachedBufferSize. Bu özelliklerin kullanılabilir olduğunu onaylamak için sürücü sürümünüz için dokümanları kontrol etmeniz gerekir.

Bu, Spring Boot HikariCP spring.datasource.hikari.data-source-propertiesseçeneği kullanılarak geçirilebilir . Spring Boot sürümünüz için dokümanları iki kez kontrol edin, bu mülk en az bir kez yeniden adlandırıldı:

application.yaml

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

application.properties

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

Ayrıca deyim getirme boyutu ile de ilgilenebilirsiniz, ancak bu optimizasyon genellikle her bildirime ayrı ayrı uygulanır.


Merhaba @Karol, teşekkürler. Bu özellikleri bir application.yml dosyası yerine application.properties dosyasını kullanarak nasıl yeniden ifade edebilirim?
anjanb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.