การปรับให้เหมาะสมของ Oracle JDBC: เปิดใช้งานแคช PreparedStatement ในแอปพลิเคชัน Spring boot


9

ฉันมีแอพพลิเคชั่น Spring Boot REST ที่เชื่อมต่อกับฐานข้อมูล Oracle เรากำลังใช้ JDBC โดยใช้ JdbcTemplate คุณสมบัติฐานข้อมูล Oracle ได้รับจากการตั้งค่า3 แอพพลิเคชั่นคุณสมบัติเหล่านี้:

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

แอปพลิเคชันนี้ใช้ HikariCP จากเว็บไซต์ HikariCP ฉันรู้ว่าพูลนี้ไม่แคช PreparedStatements เนื่องจากไดรเวอร์ JDBC เป็นโปรแกรมติดตั้งที่ดีที่สุด

ตอนนี้ฉันจะระบุและที่ไหนเพื่อให้มั่นใจว่าสิ่งเหล่านี้:

  1. โปรแกรมควบคุม Oracle JDBC (ojdbc7.jar) แคช PreparedStatements มีวิธีการกำหนดจำนวน PreparedStatements ที่สามารถแคชได้หรือไม่

  2. จากhttps://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/เราจะเห็นว่า

    ตรวจสอบให้แน่ใจว่าฐานข้อมูลของคุณถูกตั้งค่าเป็นขนาดแพ็คเก็ตสูงสุดและไดรเวอร์ตรงกับขนาดแพ็คเก็ตนั้น สำหรับการดึงชุดผลลัพธ์ที่มีขนาดใหญ่กว่านี้จะลดจำนวนของแพ็กเก็ตทั้งหมดที่ส่ง / รับระหว่างไดรเวอร์และเซิร์ฟเวอร์

ในการปฏิบัติตามข้างต้นสิ่งที่เป็นขั้นตอนที่จำเป็นในการ

  1. ค้นหาขนาดแพ็คเก็ต Oracle DB Server
  2. ค้นหาว่า Oracle DB Server ถูกตั้งค่าเป็นขนาดแพ็คเก็ตสูงสุดหรือไม่
  3. ค้นหาตั้งค่าขนาดแพ็คเก็ต (ojdbc8.jar) Oracle JDBC

เคล็ดลับการเพิ่มประสิทธิภาพ JDBC อื่น ๆ (Oracle) จะได้รับการชื่นชม


มันเหมาะสมกว่าที่จะถามในเว็บไซต์ dba? dba.stackexchange.com/questions/tagged/oracle
7294900

2
@ user7294900 ไม่จริงเพราะนี่เป็นเรื่องเกี่ยวกับการกำหนดค่าไดรเวอร์ JDBC (สมมติว่ามันมีตัวเลือกการกำหนดค่าเช่นนั้น) ซึ่งทำให้คำถามนี้เป็นคำถามการเขียนโปรแกรมไม่ใช่คำถาม DBA
Mark Rotteveel

คำตอบ:


2

สวัสดีฟังก์ชั่นเปิดใช้งานการแคชคำสั่งที่เตรียมไว้ไม่มีอะไรที่จะไม่ทำกับสปริงหรือด้วย REST ฟังก์ชันนี้เป็นคำถามของการเจรจาระหว่างแหล่งข้อมูลของคุณไดรเวอร์ JDBC และฐานข้อมูลของคุณเท่านั้น เพื่อค้นหาวิธีตั้งค่าอ่านเอกสารที่เกี่ยวข้องเกี่ยวกับไดรเวอร์แหล่งข้อมูลและฐานข้อมูลของคุณ

เมื่อพูดถึงฮิคาริวิธีที่ถูกต้องในการทำเช่นนี้คือ (แจ้งให้ทราบแหล่งข้อมูล 2 เปลี่ยนชื่อเป็นแหล่งข้อมูลเพื่อเปิดใช้งานการกำหนดค่าอัตโนมัติ):

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

คุณสมบัติภายในการกำหนดค่าของคุณจะถูกส่งตรงไปยังไดรเวอร์พื้นฐาน

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

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


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

}

ตัวอย่างนี้ใช้การเริ่มต้นด้วยตนเองของแหล่งข้อมูลพื้นฐาน


นี่คือ MySQL config cachePrepStmtsเป็นตัวเลือกไดร์เวอร์ MySQL JDBC ดูที่github.com/brettwooldridge/HikariCP/blob/ ......
Karol Dowbecki

@KarolDowbecki เป็นจริงตัวอย่าง thgis กำลังทำงานบน DB2 :)
Alexandar Petrov

Point เป็นdata-source-propertiesพร็อกซีมันจะส่งผ่านคุณสมบัติไปยังไดรเวอร์ดังนั้นหากไดรเวอร์ไม่มีcachePrepStmtsคุณสมบัติมันจะไม่ทำงาน ไดรเวอร์ ojdbc8 ไม่มีคุณสมบัตินี้
Karol Dowbecki

@KarolDowbecki บางทีคุณควรเปลี่ยนคำถามเป็น "คุณสมบัติใดที่คุณต้องการเพื่อเปิดใช้งานการแคชคำสั่งใน Oracle" แทนที่จะเกี่ยวข้องกับ spring boot REST และอะไรก็ตาม docs.oracle.com/cd/B19306_01/java.102/b14355/…
Alexandar Petrov

@AlexandarPetrov: สวัสดีฉันคือโอพีที่นี่ ฉันลบส่วนที่เหลือ ฉันต้องการคุณสมบัติการกำหนดค่าสำหรับ Oracle 11/12 โดยใช้ ojdbc7.jar
anjanb

0
  • เปิดใช้งานการแคชคำชี้แจงผ่าน

oracleDataSource.setImplicitCachingEnabled(true)

  • เลือกขนาดแคชที่เหมาะสมเพื่อใช้หน่วยความจำให้ดีที่สุด

connection.setStatementCacheSize(10) พยายามให้ใกล้เคียงกับจำนวนข้อความที่ใช้มากที่สุดขนาดแคชคำสั่งเริ่มต้นคือ 10

  • สำรองหากคุณไม่สามารถเปลี่ยนแอปพลิเคชันเพื่อใช้การแคชคำสั่ง

session_cached_cursors = 50 Connection.setStatementCacheSize(10)


ฉันไม่มีสิทธิ์เข้าถึง OracleDatasource สิ่งที่ฉันสามารถเข้าถึงได้คือ JdbcTemplate ซึ่งฉันจะได้รับแหล่งข้อมูลฮิคาริ ฉันไม่ไปที่ระดับการเชื่อมต่อ - ฉันทำงานที่ระดับ JdbcTemplate
anjanb

0

เริ่มต้นด้วยการตรวจสอบเอกสารเพื่อให้แน่ใจว่าojdbc8.jarตรงกับรุ่นของเซิร์ฟเวอร์ฐานข้อมูล มีรุ่นต่าง ๆojdbc8.jarสำหรับ 11g, 11gR2, 12c

ตามคำตอบนี้คุณต้องoracle.jdbc.implicitStatementCacheSizeตั้งค่าคุณสมบัติในไดรเวอร์ JDBC บทความนี้จะกล่าวถึงไม่กี่คุณสมบัติเพิ่มเติมเช่นไดรเวอร์ JDBC หรือoracle.jdbc.freeMemoryOnEnterImplicitCache oracle.jdbc.maxCachedBufferSizeคุณต้องตรวจสอบเอกสารสำหรับรุ่นไดรเวอร์ของคุณเพื่อยืนยันว่ามีคุณสมบัติเหล่านี้

สิ่งนี้สามารถส่งผ่านโดยใช้spring.datasource.hikari.data-source-propertiesตัวเลือกSpring Boot HikariCP ตรวจสอบเอกสารสำหรับรุ่น Spring Boot ของคุณอีกครั้งคุณสมบัตินี้ถูกเปลี่ยนชื่ออย่างน้อยหนึ่งครั้ง:

application.yaml

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

application.properties

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

คุณอาจสนใจขนาดการเรียกคำสั่งแต่การเพิ่มประสิทธิภาพนี้มักใช้กับแต่ละคำสั่งแยกกัน


สวัสดี @Karol ขอบคุณ ฉันจะเรียบเรียงคุณสมบัติเหล่านี้ใหม่โดยใช้ไฟล์ application.properties แทนไฟล์ application.yml อย่างไร
anjanb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.