2011-10-14 17 views
26

मैं (सफलतापूर्वक) का उपयोग कर एक डेटाबेस से कनेक्ट कर रहा हूँ निम्नलिखित:जावा JDBC कनेक्शन स्थिति

java.sql.Connection connect = DriverManager.getConnection(
    "jdbc:mysql://localhost/some_database?user=some_user&password=some_password"); 

क्या मैं और यदि कनेक्शन अभी भी खुला है देखने के लिए जाँच की जानी चाहिए ऊपर कुछ समय के बाद?
मैं उपयोग करने के लिए connect.isConnected(); जैसे कुछ की उम्मीद कर रहा था।

उत्तर

15

कुछ भी नहीं। बस अपनी क्वेरी निष्पादित करें। यदि कनेक्शन की मृत्यु हो गई है, तो आपका जेडीबीसी ड्राइवर फिर से कनेक्ट होगा (यदि यह इसका समर्थन करता है, और आपने इसे अपनी कनेक्शन स्ट्रिंग में सक्षम किया है - अधिकांश इसका समर्थन नहीं करते हैं) या अन्यथा आपको अपवाद मिलेगा।

यदि आप कनेक्शन की जांच करते हैं, तो यह वास्तव में आपकी क्वेरी निष्पादित करने से पहले हो सकता है, इसलिए आप जांच करके बिल्कुल कुछ हासिल नहीं कर सकते हैं।

यह कहा गया है कि कनेक्शन कनेक्शन सौंपने से पहले बहुत सारे कनेक्शन पूल SELECT 1 जैसे कुछ कनेक्शन करके कनेक्शन को मान्य करते हैं। लेकिन यह सिर्फ एक क्वेरी निष्पादित करने से ज्यादा कुछ नहीं है, इसलिए आप अपनी व्यावसायिक क्वेरी को निष्पादित भी कर सकते हैं।

+1

इसका उपयोग करने से पहले कनेक्शन का परीक्षण करने में कुछ निश्चित लाभ है (विशेष रूप से यदि यह एक लंबे समय तक रहने वाला कनेक्शन है और अंतर्निहित नेटवर्क इसका उपयोग कर सकता है)। लेकिन यह भी सटीक है कि आपको अभी भी अपने कोड में त्रुटियों को संभालने की आवश्यकता है क्योंकि यह कभी भी नीचे जा सकता है। – rogerdpack

12

Connection.isClosed() फ़ंक्शन का उपयोग करें।

JavaDoc कहता है:

पुन: प्राप्त करता है कि क्या यह Connection वस्तु बंद कर दिया गया। कनेक्शन बंद है अगर विधि बंद है या कुछ घातक त्रुटियां हुई हैं। इस विधि को वापसी true की गारंटी है जब इसे विधि कनेक्शन के बाद बुलाया जाता है। कहा गया है।

+3

उपयोग कर सकते हैं जावाडोक के रूप में कहना है कि यह ** ** इस मामले में एक वैध जवाब नहीं दे देंगे। यह केवल बताएगा कि 'बंद() 'कहा गया है या नहीं। –

+1

पोस्टग्रेस जेडीबीसी ड्राइवर (कम से कम) के साथ कुछ प्रयोग के बाद ठीक है, मूल रूप से, यदि अंतर्निहित कनेक्शन "खो गया है," 'isclosed()' अभी भी सत्य वापस आ जाएगा। हालांकि, जब आप * कनेक्शन का उपयोग करते हैं, और यह किसी भी अपवाद को उठाता है, उस बिंदु के बाद, 'isclosed() 'अब सच हो जाएगा। तो मूल रूप से आप 'isClosed' का उपयोग करके" दूर हो सकते हैं "(और 'isValid()' के लिए अतिरिक्त कॉल की विलंबता से बचें) यदि आप किसी भी तरह से यहां या वहां कोई बाधित क्वेरी कर सकते हैं। इसके अलावा 'isValid()' परीक्षण करने का एक अच्छा तरीका है, लेकिन एक अतिरिक्त दौर यात्रा समय की आवश्यकता है। – rogerdpack

+0

धन्यवाद आदमी .. यह एक आकर्षण की तरह काम किया। –

33

आपका सबसे अच्छा मौका है, बस एक तालिका के विरुद्ध एक साधारण क्वेरी प्रदर्शन करना है जैसे:

select 1 from SOME_TABLE; 

ओह, मैं अभी-अभी देखा वहाँ 1.6 के बाद से एक नई विधि उपलब्ध है:

java.sql.Connection.isValid(int timeoutSeconds):

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

+0

postgresql jdbc रिकॉर्ड के लिए "चयन 1" निष्पादित करता है। – rogerdpack

3

आप MySQL

public static boolean isDbConnected() { 
    final String CHECK_SQL_QUERY = "SELECT 1"; 
    boolean isConnected = false; 
    try { 
     final PreparedStatement statement = db.prepareStatement(CHECK_SQL_QUERY); 
     isConnected = true; 
    } catch (SQLException | NullPointerException e) { 
     // handle SQL error here! 
    } 
    return isConnected; 
} 

मैं अन्य डेटाबेस के साथ परीक्षण नहीं किया उपयोग कर रहे हैं। उम्मीद है कि यह सहायक है।

+0

'डीबी' कहां से आता है? – MonoThreaded

+0

प्रश्न 'कनेक्ट' वैरिएबल में देखें, यह' डीबी 'है जिसे आप इसे नाम दें। –

+0

फिर आप मेमोरी लीक – MonoThreaded

4

तुम भी

public boolean isDbConnected(con Connection) { 
    //final String CHECK_SQL_QUERY = "SELECT 1"; 
    try { 
     if(!con.isClosed() || con!=null){ 
      return true; 
     } 
    } catch (SQLException e) { 
     return false; 
    } 
    return false; 
} 
+2

होना चाहिए, अगर (con! = Null ||! Con.isClosed()) ताकि आपकी जांच ऑब्जेक्ट पर पहले है, अगर यह शून्य है तो यह आईएफ स्टेटमेंट के सत्यापन के साथ जारी नहीं रहेगी। आपका अपवाद अपवाद फेंक देगा क्योंकि कॉन न्यूल हो सकता है। तब आपको पूरी तरह से पकड़ने की ज़रूरत नहीं है। – Switch

संबंधित मुद्दे