2009-09-05 9 views
6

जब मैं डीबी से कनेक्ट करने के लिए हाइबरनेट को कॉन्फ़िगर करता हूं और किसी कारण से कनेक्शन विफल रहता है, मैंने देखा कि यह किसी भी अपवाद को फेंक नहीं देता है और न ही कारखाने का निर्माण करते समय (जो स्वीकार्य है) और न ही जब मैं sessionFactory.openSession() (जिसे कम स्वीकार्य है) कहते हैं। सत्र और फैक्ट्री.ऑपेन सत्र() कॉल करने के बाद सत्र.इस कनेक्ट() सही हो जाता है। (जो पूरी तरह से अस्वीकार्य है)।ओपन सत्र को खोलने पर हाइबरनेट अपवाद नहीं फेंकता है और डीबी से कनेक्शन स्थापित नहीं किया जा सकता है

उस क्षण तक एकमात्र संकेत जो मुझे बताता है कि यह डीबी से कनेक्ट नहीं है, एक java.sql.SQLException के कारण एक चेतावनी लॉग प्रविष्टि है जो आंतरिक रूप से पकड़ता है और केवल लॉगर को भेजता है। एक अपवाद को मजबूर करने के लिए छद्म लेनदेन बनाने के अलावा कनेक्शन स्थिति प्राप्त करने का कोई अन्य तरीका है? (हो सकता है कि कॉन्फ़िगरेशन में एक विकल्प "असफल कनेक्शन प्रयास लॉग न करें, लेकिन एक हाइबरनेट अपवाद फेंक दें)। मैंने खोज की है लेकिन कुछ भी नहीं मिला। बहुत धन्यवाद।

उत्तर

3

आप किस कनेक्शन पूल का उपयोग कर रहे हैं? हाइबरनेट का निर्मित- । सरल परीक्षण के अलावा और कुछ के लिए पूल should not be used में

Proxool, दूसरे हाथ पर, आप बिल्कुल आप क्या चाहते करने के लिए अनुमति देता है: सत्य पर test-before-use गुण सेट और अगर यह नहीं मिल सकता है यह एक अपवाद फेंक या एक पैदा करेगा उपयुक्त कनेक्शन। यदि आप चाहें तो listen to connection events भी कर सकते हैं।

3

जैसा कि ChssPly का उल्लेख है, आपको Hibernate के निर्माण का उपयोग नहीं करना चाहिए कुछ भी के लिए पूल में। प्रॉक्सूल के अलावा एक और विकल्प (जिसे मैंने व्यक्तिगत रूप से उपयोग नहीं किया है, इसलिए मैं व्यक्तिगत रूप से इसके लिए झुका नहीं सकता) C3P0 है। कनेक्शन पूल सेट करते समय यह निश्चित रूप से अपवाद फेंकता है - मैं इसके लिए झुका सकता हूं :) जैसा कि हम अपने आवेदन के साथ व्यवहार चाहते हैं, यह हमारे लिए पूरी तरह से काम करता है।

0

समस्या को पुन: उत्पन्न करने के लिए खेद है, लेकिन मैंने सी 3 पी 0 की कोशिश की और यह अंतर्निहित से बेहतर है, लेकिन जहां तक ​​मेरी समस्या का सवाल है, यह वैनिला हाइबरनेट से बिल्कुल अलग नहीं है: यदि यह कनेक्शन प्राप्त नहीं कर पाता है, तो यह एक फेंकता है अपवाद, हाइबरनेट उस अपवाद को पकड़ता है और, फिर से, इसे मुझसे छुपाता है। C3p0 का उपयोग करके, मैं अभी भी हाइबरनेट एपीआई का उपयोग करता हूं, और जो भी c3p0 फेंकता है, वह हाइबरनेट द्वारा चूस जाता है। एकमात्र तरीका मैं प्रोग्रामेटिक रूप से c3p0 डेटासोर्स को तुरंत चालू करना चाहता हूं, और यदि अपवाद नहीं फेंक दिया जाता है (यह मैं पकड़ सकता हूं), तो इसे हाइबरनेट पर पास करें। लेकिन फिर मुझे एहसास हुआ कि हाइबरनेट को डेटासोर्स पास करने के लिए, आप केवल जेएनडीआई यूआरएल के माध्यम से कर सकते हैं, और यह एक विकल्प नहीं है। तो मेरी आखिरी उम्मीद कस्टम कनेक्शन प्रदाता को लागू करना है, सी 3 पी 0 का उपयोग करें और वहां सी 3 पी 0 के अपवाद को पकड़ें। क्या कोई और विकल्प है?

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

+1

मुझे यहां तीन चीजों को स्पष्ट करने दें: 1) अपवाद केवल तभी फेंक दिया जाएगा जब पूल प्राप्त नहीं कर सकता है या कोई कामकाजी कनेक्शन नहीं बना सकता है - इसे केवल इसलिए नहीं फेंक दिया जाएगा क्योंकि एक विशेष कनेक्शन विफल हो गया है; 2) हाइबरनेट वास्तव में आवश्यक होने तक कनेक्शन प्राप्त करने का प्रयास नहीं करेगा: 'openSession()' ** ** ** प्राप्त नहीं करता है; 3) हाइबरनेट कनेक्शन अपवाद छिपाएगा नहीं; हालांकि, यह इसे जेडीबीसीएक्सप्शन में परिवर्तित कर देगा जो अनचेक किया गया है जो आपको पकड़ना चाहिए। – ChssPly76

+0

मुझे यकीन नहीं है कि आप वास्तव में कनेक्शन के असफल होने के बारे में इतना क्यों ख्याल रखते हैं _immediately_ जब आप वास्तव में इसके साथ कुछ करने का प्रयास करते हैं; लेकिन यदि आप करते हैं, तो 'openSession()। कनेक्शन()' जिसे ** ** प्राप्त करने का प्रयास करें और 'JDBCException' को पकड़ें, जिससे आप नेस्टेड' SQLException' प्राप्त कर सकते हैं, यदि यह विफल हो जाता है। – ChssPly76

+0

आपकी पहली टिप्पणी ने चीजों को स्पष्ट किया। एकमात्र चीज जो अब अजीब और बहुत प्रतिद्वंद्वी लगता है यह है: चूंकि आपने कहा है कि हाइबरनेट कनेक्शन प्राप्त करने का प्रयास नहीं करेगा, अगर उसे इसकी आवश्यकता नहीं है, तो सत्र.इस कनेक्ट() विधि होने का क्या मतलब है? क्या मुझे विश्वास करने के लिए किसी भी तरह से कनेक्शन प्राप्त करने की कोशिश करने की ज़रूरत है क्या कनेक्ट है() का रिटर्न वैल्यू?यदि हां, तो मुझे इसकी आवश्यकता नहीं है क्योंकि मुझे प्रयास में अपवाद मिलेगा। यह समझ में नहीं आता है ... – Paralife

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

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