कुशल SQL परीक्षण क्वेरी या सत्यापन क्वेरी जो सभी(या अधिकतर) डेटाबेस पर काम करेगी




connection-pooling (8)

कई डेटाबेस कनेक्शन पूलिंग लाइब्रेरी आलस्यता के लिए अपने एसक्यूएल कनेक्शन का परीक्षण करने की क्षमता प्रदान करते हैं। उदाहरण के लिए, जेडीबीसी पूलिंग लाइब्रेरी c3p0 में preferredTestQuery c3p0 नामक एक संपत्ति है, जिसे कॉन्फ़िगर किए गए अंतराल पर कनेक्शन पर निष्पादित किया जाता है। इसी तरह, अपाचे कॉमन्स डीबीसीपी में validationQuery कार्यक्षमता है।

मैंने देखा है कि कई example queries MySQL के लिए हैं और SELECT 1; का उपयोग करने की सलाह देते हैं SELECT 1; परीक्षण क्वेरी के लिए मूल्य के रूप में। हालांकि, यह क्वेरी कुछ डेटाबेस पर काम नहीं करती है (उदाहरण के लिए एचएसक्यूएलडीबी, जिसके लिए SELECT 1 खंड FROM अपेक्षा करता है)।

क्या कोई डेटाबेस-अज्ञात क्वेरी है जो समकक्ष रूप से कुशल है लेकिन सभी SQL डेटाबेस के लिए काम करेगी?

संपादित करें:

यदि ऐसा नहीं है (जो मामला प्रतीत होता है), क्या कोई SQL क्वेरी का एक सेट सुझा सकता है जो विभिन्न डेटाबेस प्रदाताओं के लिए काम करेगा? मेरा इरादा प्रोग्रामेटिक रूप से एक कथन निर्धारित करना होगा जिसका उपयोग मैं अपने डेटाबेस प्रदाता कॉन्फ़िगरेशन के आधार पर कर सकता हूं।


कैसा रहेगा

SELECT user()

मैं पहले इसका इस्तेमाल करता हूं। MySQL, H2 ठीक है, मैं दूसरों को नहीं जानता।


दुर्भाग्य से कोई चयन कथन नहीं है जो हमेशा डेटाबेस के बावजूद काम करेगा।

अधिकांश डेटाबेस समर्थन करते हैं:

SELECT 1

कुछ डेटाबेस इसका समर्थन नहीं करते हैं लेकिन डीयूएएल नामक एक टेबल है जिसे आप किसी तालिका की आवश्यकता नहीं होने पर उपयोग कर सकते हैं:

SELECT 1 FROM DUAL

MySQL भी अनुकूलता कारणों के लिए इसका समर्थन करता है, लेकिन सभी डेटाबेस नहीं करते हैं। उपरोक्त में से किसी एक का समर्थन नहीं करने वाले डेटाबेस के लिए एक वर्कअराउंड डीयूएएल नामक एक टेबल बनाना है जिसमें एक पंक्ति है, तो उपर्युक्त काम करेगा।

HSQLDB उपरोक्त में से कोई भी समर्थन नहीं करता है, इसलिए आप या तो DUAL तालिका बना सकते हैं या अन्यथा उपयोग कर सकते हैं:

SELECT 1 FROM any_table_that_you_know_exists_in_your_database

मान लें कि ओपी जावा जवाब चाहता है:

जेडीबीसी 3 / जावा 6 के रूप में isValid() विधि है जिसका उपयोग किसी की अपनी विधि का आविष्कार करने के बजाय किया जाना चाहिए।

जब इस विधि आईडी को कॉल किया जाता है तो ड्राइवर के कार्यान्वयनकर्ता को डेटाबेस के विरुद्ध किसी प्रकार की क्वेरी निष्पादित करने की आवश्यकता होती है। आप - केवल जेडीबीसी उपयोगकर्ता के रूप में - यह जानना या समझना नहीं है कि यह प्रश्न क्या है। आपको बस इतना करना है कि जेडीबीसी चालक के निर्माता ने अपना काम ठीक से किया है।


मैं फ़ायरबर्ड के लिए इसका इस्तेमाल करता हूं

select 1 from RDB$RELATION_FIELDS rows 1

मैं उपयोग करता हूं

Select COUNT(*) As X From INFORMATION_SCHEMA.SYSTEM_USERS Where 1=0

hsqldb 1.8.0 के लिए


यदि आपका चालक जेडीबीसी 4 अनुपालन है, तो कनेक्शन का परीक्षण करने के लिए समर्पित क्वेरी की आवश्यकता नहीं है। इसके बजाय Connection.isValid का परीक्षण करने के लिए कनेक्शन है।

जेडीबीसी 4 2006 से जावा 6 का हिस्सा है और आपको ड्राइवर को अब तक इसका समर्थन करना चाहिए!

HikariCP जैसे प्रसिद्ध कनेक्शन पूल, अभी भी एक परीक्षण क्वेरी निर्दिष्ट करने के लिए एक कॉन्फ़िगर पैरामीटर है लेकिन इसका उपयोग करने के लिए दृढ़ता से हतोत्साहित है:

🔠connectionTestQuery

यदि आपका ड्राइवर जेडीबीसी 4 का समर्थन करता है तो हम दृढ़ता से इस संपत्ति को सेट करने की सलाह देते हैं। यह "विरासत" डेटाबेस के लिए है जो जेडीबीसी 4 कनेक्शन का समर्थन नहीं करते हैं .isValid () API। यह वह क्वेरी है जो पूल से आपको कनेक्शन देने से ठीक पहले निष्पादित की जाएगी ताकि यह सत्यापित किया जा सके कि डेटाबेस से कनेक्शन अभी भी जिंदा है। दोबारा, इस संपत्ति के बिना पूल चलाने का प्रयास करें, यदि आपका ड्राइवर जेडीबीसी 4 आपको सूचित करने के लिए अनुपालन नहीं करता है तो HikariCP एक त्रुटि लॉग करेगा। डिफ़ॉल्ट: कोई नहीं


select 1 एसक्यूएल सर्वर में काम करेगा, दूसरों के बारे में निश्चित नहीं है।

तालिका बनाने के लिए मानक ansi sql का उपयोग करें और फिर उस तालिका से क्वेरी करें।


select count(*) का उपयोग करके परीक्षणों के लिए, select count(1) का उपयोग करने के लिए यह अधिक कुशल होना चाहिए क्योंकि * यह सभी कॉलम डेटा को पढ़ने का कारण बन सकता है।





connection-pooling