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

मारियाडीबी जावा कनेक्टर ड्राइवर प्रदर्शन

MARIADB जावा कनेक्टर प्रदर्शन

हम हमेशा परफॉर्मेंस की बात करते हैं। लेकिन बात हमेशा "मापें, अनुमान न लगाएं!"।

मारियाडीबी जावा कनेक्टर पर हाल ही में बहुत सारे प्रदर्शन सुधार किए गए हैं। तो, वर्तमान ड्राइवर का प्रदर्शन क्या है?

मुझे एक MySQL/MariaDB डेटाबेस तक पहुंच की अनुमति देने वाले 3 jdbc ड्राइवरों का बेंचमार्क परिणाम साझा करने दें: DrizzleJDBC, MySQL Connector/J और MariaDB java कनेक्टर।

इस ब्लॉग को लिखते समय ड्राइवर के संस्करण नवीनतम GA उपलब्ध संस्करण हैं:

  • मारियाडीबी 1.5.3
  • MySQL 5.1.39
  • बूंदा बांदी 1.4

बेंचमार्क

जेएमएच ओरेकल द्वारा विकसित एक ओरेकल माइक्रो-बेंचमार्किंग फ्रेमवर्क टूल है, जिसे ओपनजेडीके टूल्स के रूप में वितरित किया जाता है, जो आधिकारिक जावा 9 माइक्रोबेंचमार्क सूट होगा। अन्य रूपरेखाओं पर इसका विशिष्ट लाभ यह है कि इसे Oracle में उन्हीं लोगों द्वारा विकसित किया गया है जो JIT (जस्ट इन टाइम संकलन) को लागू करते हैं और अधिकांश सूक्ष्म-बेंचमार्क नुकसान से बचने की अनुमति देते हैं।

बेंचमार्क स्रोत: https://github.com/rusher/mariadb-java-driver-benchmark.

यदि आप जावा से परिचित हैं तो परीक्षण बहुत आसान हैं।
उदाहरण:

पब्लिक क्लास BenchmarkSelect1RowPrepareText BenchmarkSelect1RowPrepareAbstract {@Benchmark public String mysql(MyState State) थ्रोबल फेंकता है {रिटर्न Select1RowPrepare(state.mysqlConnectionText, State); } @Benchmark सार्वजनिक स्ट्रिंग mariadb(MyState State) थ्रोबल फेंकता है {वापसी select1RowPrepare(state.mariadbConnectionText, State); } @बेंचमार्क सार्वजनिक स्ट्रिंग बूंदा बांदी (माईस्टेट स्टेट) थ्रोएबल फेंकता है {वापसी select1RowPrepare(state.drizzleConnectionText, State); } }सार्वजनिक सार वर्ग BenchmarkSelect1RowPrepareAbstract BenchmarkInit को बढ़ाता है {निजी स्ट्रिंग अनुरोध ="CAST चुनें (? चार वर्ण सेट utf8 के रूप में)"; सार्वजनिक स्ट्रिंग select1RowPrepare (कनेक्शन कनेक्शन, MyState राज्य) SQLException फेंकता है {कोशिश करें (तैयार किए गए स्टेटमेंट तैयार किए गए स्टेटमेंट =कनेक्शन। प्रीपेयरस्टेटमेंट (अनुरोध)) {तैयारस्टेटमेंट.सेटस्ट्रिंग (1, स्टेट.इन्सर्टडेटा [स्टेट.काउंटर ++]); कोशिश करें (ResultSet rs =readyStatement.executeQuery ()) { rs.next (); वापसी rs.getString(1); } } }}

INSERT के प्रश्नों का उपयोग करने वाले परीक्षण IO और भंडारण प्रदर्शन पर निर्भरता से बचने के लिए, बाइनरी लॉग अक्षम के साथ एक BLACKHOLE इंजन को भेजे जाते हैं। यह अधिक स्थिर परिणाम प्राप्त करने की अनुमति देता है।
(ब्लैकहोल इंजन का उपयोग किए बिना और बाइनरी लॉग को अक्षम किए बिना, निष्पादन समय 10% तक भिन्न होगा)।

बेंचमार्क को मारियाडीबी सर्वर 10.1.17 और माईएसक्यूएल कम्युनिटी सर्वर 5.7.13 डेटाबेस पर निष्पादित किया गया है। निम्न दस्तावेज़ मारियाडीबी सर्वर 10.1.17 के साथ 3 ड्राइवरों का उपयोग करके परिणाम दिखाता है। MySQL सर्वर 5.7.13 वाले परिणामों सहित संपूर्ण परिणामों के लिए, कृपया दस्तावेज़ के नीचे लिंक देखें।

पर्यावरण

निष्पादन (क्लाइंट और सर्वर) निम्नलिखित मापदंडों का उपयोग करके digitalocean.com पर एकल सर्वर ड्रॉपलेट पर किया जाता है:

  • जावा (टीएम) एसई रनटाइम एनवायरनमेंट (बिल्ड 1.8.0_101-बी13) 64 बिट (इस बेंचमार्क को चलाते समय वास्तविक अंतिम संस्करण)
  • उबंटू 16.04 64बिट्स
  • 512एमबी मेमोरी
  • 1 सीपीयू
  • डेटाबेस MariaDB “10.1.17-MariaDB”, MySQL समुदाय सर्वर “5.7.15-0ubuntu0.16.04.1” का निर्माण करता है
    डिफ़ॉल्ट कॉन्फ़िगरेशन फ़ाइलों और इन अतिरिक्त विकल्पों का उपयोग करके:

    • max_allowed_packet =40M #exchange पैकेट 40mb तक हो सकता है
    • चरित्र-सेट-सर्वर =utf8 # UTF-8 को डिफ़ॉल्ट के रूप में उपयोग करने के लिए
    • collation-server =utf8_unicode_ci #UTF-8 को डिफ़ॉल्ट के रूप में उपयोग करने के लिए

जब "दूरस्थ" का संकेत दिया जाता है, तो बेंचमार्क 0.350ms के औसत पिंग के साथ एक ही डेटासेंटर पर 2 समान होस्ट पर अलग क्लाइंट और सर्वर के साथ चलाए जाते हैं।

परिणाम नमूना स्पष्टीकरण

बेंचमार्क स्कोर त्रुटि इकाइयाँबेंचमार्कSelect1RowPrepareText.mariadb 62.715 ± 2.402 µs/opBenchmarkSelect1RowPrepareText.mysql 88.670 ± 3.505 µs/opBenchmarkSelect1RowPrepareText.drizzle 78.672 ± 2.971 µs/op 

इसका मतलब यह है कि यह सरल क्वेरी 99.9% प्रश्नों के लिए ± 2.402 माइक्रोसेकंड की भिन्नता के साथ मारियाडीबी ड्राइवर का उपयोग करते हुए औसतन 62.715 माइक्रोसेकंड का समय लेगी।
ड्रिज़ल ड्राइवर का उपयोग करके समान निष्पादन में 88.670 माइक्रोसेकंड का औसत समय लगेगा, और MySQL कनेक्टर का उपयोग करते हुए 78.672 माइक्रोसेकंड (छोटे निष्पादन समय, बेहतर)।

प्रदर्शित प्रतिशत संदर्भ के रूप में mariadb पहले परिणाम (100%) के अनुसार निर्धारित किए जाते हैं, जिससे अन्य परिणामों की आसानी से तुलना करने की अनुमति मिलती है।

प्रदर्शन तुलना

बेंचमार्क एक ही स्थानीय डेटाबेस (एक ही सर्वर) और एक ही डेटासेंटर पर एक दूर के डेटाबेस (एक और समान सर्वर) का उपयोग करके 0.450ms के औसत पिंग के साथ 3 मुख्य विभिन्न व्यवहारों के प्रदर्शन का परीक्षण करेगा।

विभिन्न व्यवहार:

टेक्स्ट प्रोटोकॉल

यह विकल्प useServerPrepStmts अक्षम से संबंधित है।
क्वेरी सीधे सर्वर पर भेजी जाती हैं, क्लाइंट साइड पर किए गए सैनिटाइज्ड पैरामीटर रिप्लेसमेंट के साथ।
डेटा टेक्स्ट की तरह भेजा जाता है। उदाहरण:26 बाइट्स का उपयोग करके "1970-01-01 00:00:00.000500" टेक्स्ट की तरह एक टाइमस्टैम्प भेजा जाएगा

बाइनरी प्रोटोकॉल

यह विकल्प उपयोग सर्वरप्रेपस्टम्स सक्षम (MariaDB ड्राइवर पर डिफ़ॉल्ट कार्यान्वयन) से संबंधित है।
डेटा बाइनरी में भेजा जाता है। उदाहरण टाइमस्टैम्प "1970-01-01 00:00:00.000500" 11 बाइट्स का उपयोग करके भेजा जाएगा।

एक क्वेरी के लिए सर्वर के साथ अधिकतम 3 एक्सचेंज हैं:

  1. तैयार करें - निष्पादन के लिए विवरण तैयार करता है।
  2. निष्पादित करें - पैरामीटर भेजें
  3. DEALLOCATE PREPARE - एक तैयार स्टेटमेंट जारी करता है।

अधिक जानकारी के लिए सर्वर तैयार दस्तावेज़ देखें।

PREPARE परिणाम ड्राइवर साइड पर कैश में संग्रहीत होते हैं (डिफ़ॉल्ट आकार 250)। यदि तैयार पहले से ही कैश में है, तो PREPARE को निष्पादित नहीं किया जाएगा, DEALLOCATE को केवल तभी निष्पादित किया जाएगा जब PREPARE का उपयोग नहीं किया जाता है और कैश में नहीं होता है। इसका मतलब है कि कुछ क्वेरी निष्पादन में 3 राउंड ट्रिप होंगे, लेकिन कुछ में केवल एक राउंड ट्रिप होगा, एक PREPARE पहचानकर्ता और पैरामीटर भेजना।

फिर से लिखें

यह विकल्प रीराइटबैच्डस्टेटमेंट्स सक्षम के अनुरूप है।
रीराइट टेक्स्ट प्रोटोकॉल का उपयोग करता है और केवल बैचों की चिंता करता है। ड्राइवर तेज़ परिणामों के लिए क्वेरी को फिर से लिखेगा।

उदाहरण:
पहले बैच मान [1] और [2] के साथ ab (i) मान (?) में डालें
ab (i) मान (1), (2) में सम्मिलित करने के लिए फिर से लिखा जाएगा।

यदि क्वेरी को "बहु-मान" में फिर से नहीं लिखा जा सकता है, तो पुनर्लेखन बहु-प्रश्नों का उपयोग करेगा:
डुप्लिकेट कुंजी अद्यतन col2=पर तालिका (col1) मान (?) में डालें? मूल्यों के साथ [1,2] और [2,3] को फिर से लिखा जाएगा
तालिका में सम्मिलित करें(col1) मान (1) डुप्लिकेट कुंजी अद्यतन col2=2 पर; तालिका में डालें (col1) मान (3) पर डुप्लीकेट कुंजी अपडेट col2=4

इस विकल्प के नुकसान हैं:

  • स्वचालित वृद्धि आईडी Statement.html#getGeneratedKeys() का उपयोग करके पुनर्प्राप्त नहीं की जा सकतीं।
  • एक निष्पादन में बहु-प्रश्न सक्षम हैं। यह PreparedStatement के लिए कोई समस्या नहीं है, लेकिन यदि एप्लिकेशन कथन का उपयोग करता है जो एक सुरक्षा अवक्रमण (SQL इंजेक्शन) हो सकता है।

* मारियाडीबी और माईएसक्यूएल ने उन 3 व्यवहारों को लागू किया है, केवल टेक्स्ट प्रोटोकॉल बूंदा बांदी।

बेंचमार्क परिणाम

MariaDB ड्राइवर परिणाम

एकल चयन क्वेरी

निजी स्ट्रिंग अनुरोध ="चयन करें (? चार वर्ण सेट utf8 के रूप में)"; सार्वजनिक स्ट्रिंग select1RowPrepare (कनेक्शन कनेक्शन, MyState राज्य) SQLException फेंकता है {कोशिश करें (तैयार स्टेटमेंट तैयार स्टेटमेंट =कनेक्शन। तैयार स्टेटमेंट (अनुरोध)) { तैयारस्टेटमेंट.सेटस्ट्रिंग ( 1, State.insertData [state.counter++]); // एक यादृच्छिक 100 बाइट्स। कोशिश करें (ResultSet rs =readyStatement.executeQuery ()) { rs.next (); वापसी rs.getString(1); } }}
स्थानीय डेटाबेस:बेंचमार्क चयन1 पंक्ति तैयार करेंहिट। मारियाडब 58.267 ± 2.270 μs/opBenchmarkSelect1RowPrepareMiss.mariadb 118.896 ± 5.500 µs/opBenchmarkSelect1RowPrepareText.mariadb 62.715 ± 2.402 µs/op
DISTANT DATABASE:BenchmarkSelect1RowPrepareHit.mariadb 394.354 ± 13.102 µs/opBenchmarkSelect1RowPrepareMiss.mariadb 709.843 ± 31.090 µs/opBenchmarkSelect1RowPrepareText.mariadb 422.215 ± 15.8pre>s 

जब इस सटीक क्वेरी के लिए PREPARE परिणाम पहले से ही कैश (कैश हिट) में है, तो टेक्स्ट प्रोटोकॉल का उपयोग करने की तुलना में क्वेरी तेज (इस उदाहरण में 7.1%) होगी। अतिरिक्त अनुरोध PREPARE और DEALLOCATE एक्सचेंजों के कारण, कैश मिस 68.1% धीमी है।

यह बाइनरी प्रोटोकॉल का उपयोग करने के फायदे और असुविधाओं पर जोर देता है। कैश हिट महत्वपूर्ण है।

एकल सम्मिलित क्वेरी

निजी स्ट्रिंग अनुरोध ="ब्लैकहोलटेबल (चारवैल्यू) मान (?)" में डालें; सार्वजनिक बूलियन एक्ज़िक्यूटऑनइन्सर्टप्रेपेयर (कनेक्शन कनेक्शन, स्ट्रिंग [] डेटा) SQLException को फेंकता है {कोशिश करें (तैयार किए गए स्टेटमेंट तैयार किए गए स्टेटमेंट =कनेक्शन। तैयार किए गए स्टेटमेंट (अनुरोध)) { तैयार किए गए स्टेटमेंट। सेटस्ट्रिंग (1, डेटा [0]); // एक रैंडम 100 बाइट डेटा रिटर्न तैयार स्टेटमेंट.एक्सक्यूट (); }}
स्थानीय डेटाबेस:BenchmarkOneInsertPrepareHit.mariadb 61.298 ± 1.940 µs/opBenchmarkOneInsertPrepareMiss.mariadb 130.896 ± 6.362 µs/opBenchmarkOneInsertPrepareText.mariadb 68.363 ± 2.6pre> 
DISTANT DATABASE:BenchmarkOneInsertPrepareHit.mariadb 379.295 ± 17.351 µs/opBenchmarkOneInsertPrepareMiss.mariadb 802.287 ± 24.825 µs/opBenchmarkOneInsertPrepareText.mariadb 415.125s/op

INSERTs के परिणाम SELECTs परिणामों के समान हैं।

बैच :1000 क्वेरी डालें

निजी स्ट्रिंग अनुरोध ="ब्लैकहोलटेबल (चारवैल्यू) मान (?)" में डालें; सार्वजनिक int [] निष्पादित बैच (कनेक्शन कनेक्शन, स्ट्रिंग [] डेटा) SQLException फेंकता है {कोशिश करें (तैयार स्टेटमेंट तैयार स्टेटमेंट =कनेक्शन। तैयार स्टेटमेंट (अनुरोध)) { के लिए (int i =0; i <1000; i++) { readyStatement.setString(1, data[i]); // एक यादृच्छिक 100 बाइट डेटा तैयार स्टेटमेंट। एडबैच (); } वापसी तैयारस्टेटमेंट.executeBatch (); }}
स्थानीय डेटाबेस:PrepareStatementBatch100InsertPrepareHit.mariadb 5.290 ± 0.232 ms/opPrepareStatementBatch100InsertRewrite.mariadb 0.404 ± 0.014 ms/opPrepareStatementBatch100InsertText.mariadb 6.081 ± 0.254 ms/op

DISTANT डेटाबेस:PrepareStatementBatch100InsertPrepareHit.mariadb 7.639 ± 0.476 ms/opPrepareStatementBatch100InsertRewrite.mariadb 1.164 ± 0.037 ms/opPrepareStatementBatch100InsertText.mariadb 8.148 ± 0.563 ms/op

बाइनरी प्रोटोकॉल का उपयोग करना यहां अधिक महत्वपूर्ण है, जिसके परिणाम टेक्स्ट प्रोटोकॉल का उपयोग करने की तुलना में 13% तेज हैं।

इंसर्ट को बल्क द्वारा भेजा जाता है और परिणाम एसिंक्रोनस रूप से पढ़े जाते हैं (जो कि optionuseBatchMultiSend से मेल खाती है)। यह उन स्थानीय से दूर नहीं प्रदर्शन के साथ दूर के परिणाम प्राप्त करने की अनुमति देता है।

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

अन्य ड्राइवरों के साथ तुलना

एक पंक्ति परिणाम वाली क्वेरी चुनें

BenchmarkSelect1RowPrepareHit.mariadb 58.267 ± 2.270 µs/opBenchmarkSelect1RowPrepareHit.mysql 73.789 ± 1.863 µs/opBenchmarkSelect1RowPrepareMiss.mariadb 118.896 ± 5.500 µs/opBenchmarkSelect1RowPrepareMiss.mysql 150.679 ± 4.791 µs/opBenchmarkSelect1RowPrepareText.mariadb 62.715 ± 2.402 µs/opBenchmarkSelect1RowPrepareText.mysql 88.670 ± 3.505 µs /opBenchmarkSelect1RowPrepareText.drizzle 78.672 ± 2.971 µs/opBenchmarkSelect1RowPrepareTextHA.mariadb 64.676 ± 2.192 µs/opBenchmarkSelect1RowPrepareTextHA.mysql 137.289 ± 4.872 µs/op

HA मास्टर-स्लेव कॉन्फ़िगरेशन का उपयोग करते हुए "उच्च उपलब्धता" के लिए खड़ा है
(कनेक्शन URL "jdbc:mysql:replication://localhost:3306,localhost:3306/testj") है।

ये परिणाम कई अलग-अलग कार्यान्वयन विकल्पों के कारण हैं। यहां कुछ कारण बताए गए हैं जो समय के अंतर की व्याख्या करते हैं:

  • MariaDB ड्राइवर को UTF-8 के लिए ऑप्टिमाइज़ किया गया है, जिससे बाइट ऐरे के कम निर्माण की अनुमति मिलती है, एरे कॉपी और मेमोरी खपत से बचा जाता है।
  • HA कार्यान्वयन :MariaDB और MySQL ड्राइवर स्टेटमेंट ऑब्जेक्ट और सॉकेट के बीच बैठे जावा डायनेमिक Proxyclass का उपयोग करते हैं, जिससे फ़ेलओवर व्यवहार जोड़ने की अनुमति मिलती है। उन अतिरिक्त के लिए प्रति क्वेरी 2 माइक्रोसेकंड का ओवरहेड खर्च होगा (62.715 बिना 64.676 माइक्रोसेकंड बने)।
    MySQL कार्यान्वयन में, लगभग सभी आंतरिक विधियों को प्रॉक्सी किया जाता है, बहुत सारी विधियों के लिए ओवरहेड जोड़ना, जिनका फ़ेलओवर से कोई लेना-देना नहीं है, जोड़ना प्रत्येक क्वेरी के लिए कुल 50 माइक्रोसेकंड का ओवरहेड।

(बूंदा बांदी में कोई तैयारी नहीं है, न ही HA कार्यक्षमता)

“1000 पंक्तियां चुनें”

निजी स्ट्रिंग अनुरोध ="seq_1_to_1000 से * चुनें"; // सीक्वेंस स्टोरेज इंजनप्राइवेट रिजल्टसेट का उपयोग करते हुए Select1000Row (कनेक्शन कनेक्शन) SQLException फेंकता है {कोशिश करें (स्टेटमेंट स्टेटमेंट =कनेक्शन। क्रिएटस्टेटमेंट ()) {कोशिश करें (ResultSet rs =Statement.executeQuery (अनुरोध)) {जबकि (rs.next ()) { rs.getString(1); } रुपये वापसी; } }
BenchmarkSelect1000Rows.mariadb 244.228 ± 7.686 µs/opBenchmarkSelect1000Rows.mysql 298.814 ± 12.143 µs/opBenchmarkSelect1000Rows.drizzle 406.877 ± 16.585 µs/op

बहुत सारे डेटा का उपयोग करते समय, ज्यादातर समय सॉकेट से पढ़ने और क्लाइंट को वापस भेजने के लिए मेमोरी में परिणाम संग्रहीत करने में व्यतीत होता है। यदि बेंचमार्क केवल परिणामों को पढ़े बिना SELECT को निष्पादित कर रहा था, तो MySQL और MariaDB निष्पादन समय बराबर होगा। चूंकि SELECT क्वेरी का लक्ष्य परिणाम प्राप्त करना है, MariaDB ड्राइवर को परिणाम वापस देने के लिए अनुकूलित किया गया है (बाइट्स सरणियों के निर्माण से बचना)।

“1000 पंक्तियां डालें”

LOCAL DATABASE:PrepareStatementBatch100InsertPrepareHit.mariadb 5.290 ± 0.232 ms/opPrepareStatementBatch100InsertPrepareHit.mysql 9.015 ± 0.440 ms/opPrepareStatementBatch100InsertRewrite.mariadb 0.404 ± 0.014 ms/opPrepareStatementBatch100InsertRewrite.mysql 0.592 ± 0.016 ms/opPrepareStatementBatch100InsertText.mariadb 6.081 ± 0.254 ms/opPrepareStatementBatch100InsertText.mysql 7.932 ± 0.293 एमएस/opPrepareStatementBatch100InsertText.drizzle 7.314 ± 0.205 एमएस/ऑप
DISTANT DATABASE:PrepareStatementBatch100InsertPrepareHit.mariadb 7.639 ± 0.476 ms/opPrepareStatementBatch100InsertPrepareHit.mysql 43.636 ± 1.408 ms/opPrepareStatementBatch100InsertRewrite.mariadb 1.164 ± 0.037 ms/opPrepareStatementBatch100InsertRewrite.mysql 1.432 ± 0.050 ms/opPrepareStatementBatch100InsertText.mariadb 8.148 ± 0.563 ms/opPrepareStatementBatch100InsertText.mysql 43.804 ± 1.417 ms/opPrepareStatementBatch100InsertText.drizzle 38.735 ± 1.731 ms/op

MySQL और Drizzle बल्क इंसर्ट X INSERT की तरह हैं:ड्राइवर 1 INSERT भेजें, इंसर्ट रिजल्ट की प्रतीक्षा करें, और अगला इंसर्ट भेजें। प्रत्येक सम्मिलन के बीच नेटवर्क विलंबता सम्मिलन को धीमा कर देगी।

स्टोर प्रक्रियाएं

प्रक्रिया कॉल

//CREATE PROCESS inoutParam(INOUT p1 INT) start set p1 =p1 + 1; एंडप्राइवेट स्ट्रिंग अनुरोध ="{कॉल इनऑटपरम (?)}"; निजी स्ट्रिंग कॉल करने योग्य स्टेटमेंटविथऑट पैरामीटर (कनेक्शन कनेक्शन, माईस्टेट स्टेट) SQLException फेंकता है {कोशिश करें (कॉल करने योग्य स्टेटमेंट स्टोरप्रोक =कनेक्शन। तैयार कॉल (अनुरोध)) { storeProc.setInt (1, State.functionVar1); // storeProc.registerOutParameter(1, Types.INTEGER); storeProc.execute (); वापसी storeProc.getString(1); }}
BenchmarkCallableStatementWithOutParameter.mariadb 88.572 ± 4.263 µs/opBenchmarkCallableStatementWithOutParameter.mysql 714.108 ± 44.390 µs/op

MySQL और MariaDB कार्यान्वयन पूरी तरह से भिन्न हैं। Mysql ड्राइवर आउटपुट परिणाम प्राप्त करने के लिए कई छिपे हुए प्रश्नों का उपयोग करेगा:

  • SHOW CREATE PROCEDURE testj.inoutParam IN और OUT मापदंडों की पहचान करने के लिए
  • SET @com_mysql_jdbc_outparam_p1 = 1 IN / OUT मापदंडों के अनुसार डेटा भेजने के लिए
  • CALL testj.inoutParam(@com_mysql_jdbc_outparam_p1) कॉल प्रक्रिया
  • SELECT @com_mysql_jdbc_outparam_p1 आउटपुट परिणाम पढ़ने के लिए

मारियाडीबी कार्यान्वयन बिना किसी अतिरिक्त प्रश्न के सर्वर प्रतिक्रिया में आउट पैरामीटर रखने की क्षमता का उपयोग करके सीधा है। (यही मुख्य कारण है कि MariaDB ड्राइवर को MariaDB/MySQL सर्वर संस्करण 5.5.3 या बाद के संस्करण की आवश्यकता होती है)।

निष्कर्ष

मारियाडीबी ड्राइवर रॉक!

बाइनरी प्रोटोकॉल के अलग-अलग फायदे हैं लेकिन पहले से ही कैश में PREPARE परिणाम होने पर निर्भर करता है। यदि एप्लिकेशन में कई प्रकार के प्रश्न हैं और डेटाबेस दूर है, तो यह बेहतर समाधान नहीं हो सकता है।

बैच में डेटा लिखने के लिए पुनर्लेखन के अद्भुत परिणाम हैं

ड्राइवर अन्य ड्राइवरों की तुलना में अच्छा रखता है। और अभी बहुत कुछ आना बाकी है, लेकिन यह एक और कहानी है।

कच्चे परिणाम:

  1. एक MariaDB 10.1.17 डेटाबेस के साथ स्थानीय, दूर
  2. MySQL कम्युनिटी सर्वर 5.7.15 डेटाबेस के साथ (बिल्ड 5.7.15-0ubuntu0.16.04.1) स्थानीय

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मारियाडीबी JSON_OBJECT () समझाया गया

  2. उच्च उपलब्धता MySQL और MariaDB समाधानों में उच्च विलंबता के प्रभावों को समझना

  3. मारियाडीबी 10.2 समर्थन की घोषणा - क्लस्टरकंट्रोल 1.5

  4. कैसे CURDATE () मारियाडीबी में काम करता है

  5. मारियाडीबी SESSION_USER () समझाया गया