PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

JDBC बैच संचालन समझ

इसमें विभिन्न प्रकार के बैचिंग शामिल हो सकते हैं, और मैं इसके भाग PostgreSQL JDBC ड्राइवर (pgjdbc) को कवर करूंगा।

टीएल; डीआर:बैच एपीआई का उपयोग करने के मामले में पीजीजेडीबीसी कम नेटवर्क राउंडरिप्स का उपयोग करता है। BatchedQuery केवल तभी उपयोग किया जाता है जब reWriteBatchedInserts=true pgjdbc कनेक्शन सेटिंग में पास किया जाता है।

आपको https://www.slideshare.net/VladimirSitnikv/postgresql-and-jdbc-strving-for-high-performance प्रासंगिक (स्लाइड 44,...)

मिल सकती है

जब क्वेरी निष्पादन की बात आती है, तो नेटवर्क विलंबता अक्सर बीता हुआ समय का एक महत्वपूर्ण हिस्सा होता है।

मान लीजिए मामला 10 पंक्तियों को सम्मिलित करने का है।

  1. कोई बैचिंग नहीं (उदा. केवल PreparedStatement#execute एक लूप में)। ड्राइवर निम्न कार्य करेगा

    execute query
    sync <-- wait for the response from the DB
    execute query
    sync <-- wait for the response from the DB
    execute query
    sync <-- wait for the response from the DB
    ...
    

    उल्लेखनीय समय "डीबी की प्रतीक्षा" में व्यतीत होगा

  2. जेडीबीसी बैच एपीआई। वह है PreparedStatement#addBatch() ड्राइवर को एकल नेटवर्क राउंडट्रिप में एकाधिक "क्वेरी निष्पादन" भेजने में सक्षम बनाता है। हालांकि वर्तमान कार्यान्वयन, टीसीपी गतिरोध से बचने के लिए अभी भी बड़े बैचों को छोटे बैचों में विभाजित करेगा।

    कार्य बहुत बेहतर होंगे:

    execute query
    ...
    execute query
    execute query
    execute query
    sync <-- wait for the response from the DB
    
  3. ध्यान दें, कि #addBatch . के साथ भी , "निष्पादित क्वेरी" कमांड का ओवरहेड है। प्रत्येक संदेश को व्यक्तिगत रूप से संसाधित करने में सर्वर को उल्लेखनीय समय लगता है।

    प्रश्नों की संख्या को कम करने के तरीकों में से एक बहु-मान डालने का उपयोग करना है। उदाहरण के लिए:

    insert into tab(a,b,c) values (?,?,?), (?,?,?), ..., (?,?,?)
    

    यह PostgreSQL एक साथ कई पंक्तियों को सम्मिलित करने में सक्षम बनाता है। दोष यह है कि आपके पास विस्तृत (प्रति-पंक्ति) त्रुटि संदेश नहीं है। वर्तमान में हाइबरनेट बहु-मान डालने को लागू नहीं करता है।

    हालांकि pgjdbc 9.4.1209 (2016-07-15) से नियमित बैच इंसर्ट को बहु-मूल्यों में फिर से लिख सकता है।

    बहु-मान पुनर्लेखन को सक्रिय करने के लिए, आपको reWriteBatchedInserts=true जोड़ना होगा कनेक्शन संपत्ति। यह सुविधा शुरू में https://github.com/pgjdbc/pgjdbc/pull/491

    में विकसित की गई थी।

    10 पंक्तियों को सम्मिलित करने के लिए 2 कथनों का उपयोग करना काफी स्मार्ट है। पहला वाला 8-वैल्यू स्टेटमेंट है, और दूसरा 2-वैल्यू स्टेटमेंट है। दो की शक्तियों का उपयोग pgjdbc को अलग-अलग कथनों की संख्या को बनाए रखने में सक्षम बनाता है, और यह प्रदर्शन में सुधार करता है क्योंकि अक्सर उपयोग किए जाने वाले कथन सर्वर-तैयार होते हैं (देखें PostgreSQL सर्वर-साइड तैयार कथन का जीवन काल क्या है)

    BatchedQuery उस तरह के बहु-मूल्यवान बयानों का प्रतिनिधित्व कर रहा है, इसलिए आप देखेंगे कि वह वर्ग reWriteBatchedInserts=true में उपयोग किया गया है केवल मामला।

    सुविधा की कमियों में शामिल हो सकते हैं:"बैच परिणाम" के रूप में कम विवरण। उदाहरण के लिए, नियमित बैच आपको "प्रति कथन पंक्ति गणना" देता है, हालांकि बहु-मूल्यों के मामले में आपको केवल "विवरण पूर्ण" स्थिति मिलती है। उसके ऊपर, ऑन-द-फ्लाई रीराइटर कुछ SQL कथनों को पार्स करने में विफल हो सकता है (जैसे https://github.com/pgjdbc/pgjdbc/issues/1045 )।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL क्वेरी के साथ फ़ंक्शन का परिणाम डेटा के लिए कोई गंतव्य नहीं है

  2. वर्चर फ़ील्ड के प्रकार को पूर्णांक में बदलें:पूर्णांक टाइप करने के लिए स्वचालित रूप से कास्ट नहीं किया जा सकता

  3. मैं Postgres में दिनांक स्वरूप कैसे बदलूं?

  4. Postgres में JSON फ़ील्ड पर इंडेक्स कैसे बनाएं?

  5. SQL 30 दिनों से पुराने सभी रिकॉर्ड प्राप्त करें