इसमें विभिन्न प्रकार के बैचिंग शामिल हो सकते हैं, और मैं इसके भाग PostgreSQL JDBC ड्राइवर (pgjdbc) को कवर करूंगा।
टीएल; डीआर:बैच एपीआई का उपयोग करने के मामले में पीजीजेडीबीसी कम नेटवर्क राउंडरिप्स का उपयोग करता है। BatchedQuery
केवल तभी उपयोग किया जाता है जब reWriteBatchedInserts=true
pgjdbc कनेक्शन सेटिंग में पास किया जाता है।
आपको https://www.slideshare.net/VladimirSitnikv/postgresql-and-jdbc-strving-for-high-performance प्रासंगिक (स्लाइड 44,...)
मिल सकती हैजब क्वेरी निष्पादन की बात आती है, तो नेटवर्क विलंबता अक्सर बीता हुआ समय का एक महत्वपूर्ण हिस्सा होता है।
मान लीजिए मामला 10 पंक्तियों को सम्मिलित करने का है।
-
कोई बैचिंग नहीं (उदा. केवल
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 ...
उल्लेखनीय समय "डीबी की प्रतीक्षा" में व्यतीत होगा
-
जेडीबीसी बैच एपीआई। वह है
PreparedStatement#addBatch()
ड्राइवर को एकल नेटवर्क राउंडट्रिप में एकाधिक "क्वेरी निष्पादन" भेजने में सक्षम बनाता है। हालांकि वर्तमान कार्यान्वयन, टीसीपी गतिरोध से बचने के लिए अभी भी बड़े बैचों को छोटे बैचों में विभाजित करेगा।कार्य बहुत बेहतर होंगे:
execute query ... execute query execute query execute query sync <-- wait for the response from the DB
-
ध्यान दें, कि
#addBatch
. के साथ भी , "निष्पादित क्वेरी" कमांड का ओवरहेड है। प्रत्येक संदेश को व्यक्तिगत रूप से संसाधित करने में सर्वर को उल्लेखनीय समय लगता है।प्रश्नों की संख्या को कम करने के तरीकों में से एक बहु-मान डालने का उपयोग करना है। उदाहरण के लिए:
insert into tab(a,b,c) values (?,?,?), (?,?,?), ..., (?,?,?)
यह PostgreSQL एक साथ कई पंक्तियों को सम्मिलित करने में सक्षम बनाता है। दोष यह है कि आपके पास विस्तृत (प्रति-पंक्ति) त्रुटि संदेश नहीं है। वर्तमान में हाइबरनेट बहु-मान डालने को लागू नहीं करता है।
हालांकि pgjdbc 9.4.1209 (2016-07-15) से नियमित बैच इंसर्ट को बहु-मूल्यों में फिर से लिख सकता है।
बहु-मान पुनर्लेखन को सक्रिय करने के लिए, आपको
में विकसित की गई थी।reWriteBatchedInserts=true
जोड़ना होगा कनेक्शन संपत्ति। यह सुविधा शुरू में https://github.com/pgjdbc/pgjdbc/pull/49110 पंक्तियों को सम्मिलित करने के लिए 2 कथनों का उपयोग करना काफी स्मार्ट है। पहला वाला 8-वैल्यू स्टेटमेंट है, और दूसरा 2-वैल्यू स्टेटमेंट है। दो की शक्तियों का उपयोग pgjdbc को अलग-अलग कथनों की संख्या को बनाए रखने में सक्षम बनाता है, और यह प्रदर्शन में सुधार करता है क्योंकि अक्सर उपयोग किए जाने वाले कथन सर्वर-तैयार होते हैं (देखें PostgreSQL सर्वर-साइड तैयार कथन का जीवन काल क्या है)
BatchedQuery
उस तरह के बहु-मूल्यवान बयानों का प्रतिनिधित्व कर रहा है, इसलिए आप देखेंगे कि वह वर्गreWriteBatchedInserts=true
में उपयोग किया गया है केवल मामला।सुविधा की कमियों में शामिल हो सकते हैं:"बैच परिणाम" के रूप में कम विवरण। उदाहरण के लिए, नियमित बैच आपको "प्रति कथन पंक्ति गणना" देता है, हालांकि बहु-मूल्यों के मामले में आपको केवल "विवरण पूर्ण" स्थिति मिलती है। उसके ऊपर, ऑन-द-फ्लाई रीराइटर कुछ SQL कथनों को पार्स करने में विफल हो सकता है (जैसे https://github.com/pgjdbc/pgjdbc/issues/1045 )।