ओरेकल JDBC ऑप्टिमाइज़ेशन: स्प्रिंग बूट एप्लिकेशन में रेडीएस्टस्टेटमेंट कैशिंग सक्षम करें


9

मेरे पास एक स्प्रिंग बूट रीस्ट एप्लिकेशन है जो ओरेकल डेटाबेस से जुड़ा है। हम JDbTemplate का उपयोग करके JDBC का उपयोग कर रहे हैं। Oracle डेटाबेस गुण इन 3 application.properties सेटिंग्स के माध्यम से प्राप्त किए जाते हैं:

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

यह एप्लिकेशन HikariCP का उपयोग कर रहा है। HikariCP वेबसाइट से, मुझे पता चला है कि यह पूल एग्जिपडेस्टेमेंट को कैश नहीं करता है क्योंकि ऐसा करने के लिए JDBC ड्राइवर सबसे अच्छा सेटअप है।

अब, मैं यह सुनिश्चित करने के लिए कहां और क्या निर्दिष्ट करूंगा:

  1. कि ओरेकल JDBC ड्राइवर (ojdbc7.jar) रेडीस्टेडमेंट को कैश करता है। क्या तैयारी करने की संख्या को अनुकूलित करने का एक तरीका है कि वह कैश कर सके।

  2. से https://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/ हम देख

    सुनिश्चित करें कि आपका डेटाबेस अधिकतम पैकेट आकार पर सेट है और ड्राइवर उस पैकेट के आकार से मेल खाता है। बड़े परिणाम सेट लाने के लिए, यह ड्राइवर और सर्वर के बीच भेजे गए / प्राप्त कुल पैकेटों की संख्या को कम कर देता है।

उपरोक्त के अनुसरण में, किन चरणों की आवश्यकता है

  1. ओरेकल डीबी सर्वर पैकेट आकार खोजें
  2. यदि ओरेकल डीबी सर्वर अधिकतम पैकेट आकार पर सेट है, तो उसे खोजें
  3. ओरेकल JDBC ड्राइवर (ojdbc8.jar) पैकेट आकार निर्धारित करें।

किसी भी अन्य (ओरेकल) JDBC प्रदर्शन अनुकूलन टिप की सराहना की जाएगी।


क्या यह dba साइट में पूछने के लिए अधिक उपयुक्त है? dba.stackexchange.com/questions/tagged/oracle
user7294900

2
@ user7294900 वास्तव में नहीं, क्योंकि यह JDBC ड्राइवर को कॉन्फ़िगर करने के बारे में है (यह मानते हुए कि ऐसा कॉन्फ़िगरेशन विकल्प भी है), जो इसे एक प्रोग्रामिंग प्रश्न बनाता है और DBA प्रश्न नहीं।
मार्क रोटेवेल

जवाबों:


2

हाय फंक्शन इनेबल तैयार स्टेटमेंट कैशिंग का न तो स्प्रिंग से कोई लेना-देना है, न ही रीस्ट से। यह फ़ंक्शन केवल आपके डेटा स्रोत, आपके 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 कॉन्फिगरेशनcachePrepStmts है , एक MySQL JDBC ड्राइवर ऑप्शन है, जिसे github.com/brettwooldridge/HikariCP/blob/… और dev.mysql.com/doc/connector-j/5.1/en// पर
करोल दोबेकी

@KarolDowbecki वास्तविक thgis उदाहरण DB2 पर चल रहा था :)
अलेक्जेंडर पेट्रोव

बिंदु data-source-propertiesएक छद्म है, यह ड्राइवर को गुण देता है, इसलिए यदि ड्राइवर के पास cachePrepStmtsसंपत्ति नहीं है तो यह काम नहीं करेगा। ojdbc8 ड्राइवर में यह गुण नहीं है।
करोल डोबेकी

@KarolDowbecki शायद आपको सवाल बदलना चाहिए कि "ओरेकल में स्टेटमेंट कैशिंग को सक्षम करने के लिए आपको कौन सी संपत्ति की आवश्यकता है" बसंत बूट रेस्ट और जो भी शामिल हो। docs.oracle.com/cd/B19306_01/java.102/b14355/…
पेट्रोव

@AlexandarPetrov: हाय, मैं यहाँ ओपी हूँ। मैंने REST भाग हटा दिया। मुझे Oracle 11/12 के लिए ojdbc7.jar
anjanb

0
  • के माध्यम से स्टेटमेंट कैशिंग सक्षम करें

oracleDataSource.setImplicitCachingEnabled(true)

  • मेमोरी का सर्वोत्तम उपयोग करने के लिए सही कैश आकार चुनें

connection.setStatementCacheSize(10) सबसे अधिक इस्तेमाल किए जाने वाले बयानों की संख्या के करीब होने की कोशिश करें डिफ़ॉल्ट स्टेटमेंट कैश आकार 10 है

  • यदि आप स्टेटमेंट कैशिंग का उपयोग करने के लिए एप्लिकेशन को परिवर्तित नहीं कर सकते हैं तो फ़ॉलबैक करें

session_cached_cursors = 50 Connection.setStatementCacheSize(10)


मेरे पास OracleDatasource की पहुंच नहीं है। मेरे पास सभी पहुंच JdbcTemplate है जिसमें से मुझे Hikari डेटा स्रोत मिलेगा। मैं कनेक्शन स्तर पर भी नहीं जाता - मैं JdbcTemplate स्तर पर काम करता हूं।
अंजनब

0

ojdbc8.jarडेटाबेस सर्वर संस्करण से मेल खाता है यह सुनिश्चित करने के लिए प्रलेखन की जांच करके शुरू करें । ojdbc8.jar11g, 11gR2, 12c के विभिन्न संस्करण हैं ।

इस उत्तर के अनुसार , आपको oracle.jdbc.implicitStatementCacheSizeJDBC ड्राइवर में सेट की जाने वाली संपत्ति चाहिए। इस लेख में कुछ और JDBC ड्राइवर गुण जैसे oracle.jdbc.freeMemoryOnEnterImplicitCacheया oracle.jdbc.maxCachedBufferSize। आपको ये पुष्टि करने की आवश्यकता है कि ये गुण उपलब्ध हैं या नहीं।

यह स्प्रिंग बूट HikariCP spring.datasource.hikari.data-source-propertiesविकल्प का उपयोग करके पारित किया जा सकता है । आपके स्प्रिंग बूट संस्करण के लिए डबल चेक डॉक्स, इस संपत्ति का नाम बदलकर कम से कम एक बार किया गया था:

application.yaml

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

application.properties

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

आपको कथन के आकार में भी रुचि हो सकती है लेकिन यह अनुकूलन आमतौर पर प्रत्येक कथन पर अलग से लागू होता है।


हाय @ करोल, धन्यवाद। मैं Application.yml फ़ाइल के बजाय application.properties फ़ाइल का उपयोग करके इन गुणों को कैसे पुनः प्राप्त करूंगा?
अंजन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.