यह बहुत सारे प्रश्न हैं :) मैं पिछले उत्तरों को पूरा करने की कोशिश करूंगा।
Is there a better way to simulate the DB failure?
परीक्षण सभी मामलों जटिल है। मुख्य मामलों का परीक्षण करने का एक तरीका एक जेसीए कनेक्टर बनाना होगा (एक डीबी चालक एक जेसीए कनेक्टर है)। आप कनेक्टर से कनेक्शन प्राप्त कर सकते हैं जिसे लेनदेन में सूचीबद्ध किया जाएगा (एक तीसरा प्रतिभागी)। कनेक्शन तब कुछ त्रुटियों को बढ़ा सकता है।
तीन भाग हैं जो एक साथ काम करते हैं: (1) आवेदन, (2) ऐप। सर्वर का लेनदेन प्रबंधक, और (3) जेसीए कनेक्टर (तथाकथित संसाधन एडाप्टर)।
ManagedConnection.getXAResource
के माध्यम से लेन-देन में कनेक्शन हुक ही। कस्टम जेसीए कनेक्टर के साथ आप एप्लिकेशन में अपवाद बढ़ा सकते हैं (चित्र में Connection
) या एप्लिकेशन सर्वर के लेनदेन प्रबंधक (XAResource
चित्र में ManagedConnection
के माध्यम से प्राप्त)। आप XAResource.prepare
और XAResource.commit
के दौरान विशेष रूप से अपवाद फेंक सकते हैं, जो त्रुटियों के अनुरूप 2 चरण प्रतिबद्धता के दौरान होता है।
ध्यान दें कि प्रतिभागियों के उत्थान के आदेश को नियंत्रित करना मुश्किल है (this question देखें)। तो यह जांचना आसान है कि prepare
में से एक विफल रहता है (अर्थात् आपका), लेकिन उस क्रम को नियंत्रित करना मुश्किल है जिसमें उन्हें बुलाया जाता है। 2 चरण प्रतिबद्धता के सभी संभावित अमान्य राज्यों को पुन: उत्पादित करना जटिल है, खासकर जब खेल में अनुकूलन लेना।
(मैं एक बार एक JCA कनेक्टर (http://code.google.com/p/txfs) ने लिखा है और यदि आप नमूना कोड चाहते हैं वहाँ दूसरों आसपास हैं,।)
What happens to the connection object when DB connection goes bad?
Does it retain its value or does it become null?
ManagedConnection
लेन-देन के प्रबंधक को सूचित कर सकते हैं। अधिसूचना में से एक ConnectionEvent.CONNECTION_ERROR_OCCURRED
है जो यह सूचित करता है कि इस विशेष कनेक्शन का उपयोग करते समय एक त्रुटि हुई।
जैसा कि अन्य उत्तर में बताया गया है, आमतौर पर प्रति लेनदेन से जुड़े एक प्रबंधित कनेक्शन होते हैं। प्रबंधित कनेक्शन भौतिक कनेक्शन को सारणीबद्ध करता है, और आप बहुत अधिक उपयोग नहीं करना चाहते हैं। एप्लिकेशन को केवल "हैंडल" प्राप्त होता है (चित्र में Connection
)। एक ही लेनदेन के भीतर हैंडल एक ही प्रबंधित कनेक्शन के लिए सभी बिंदुओं को प्राप्त करते हैं। यह एक अनुकूलन है कि अधिकांश ऐप सर्वर समर्थन करते हैं।
यदि प्रबंधित कनेक्शन अमान्य हो जाता है, तो इसका उपयोग करने वाले हैंडल भी अमान्य हो जाते हैं। लेकिन हैंडल AFAIK को "ताज़ा" नहीं कर सकते हैं। लेनदेन रोलबैक होना चाहिए, प्रबंधित कनेक्शन नष्ट हो गया है। जब कोई अन्य लेनदेन शुरू होता है तो यह पूल से दूसरे वैध प्रबंधित कनेक्शन से जुड़ा होगा।
What actually happens when application tries to reconnect to DB?
What value does connection object get?
Does it use an existing value from the connection pool?
अनुप्रयोग सर्वर में कामयाब कनेक्शन का एक पूल प्रबंधन करता है। जैसा कि पिछले अनुच्छेद में कहा गया है, इसका इस्तेमाल होने पर बुरा हो सकता है। लेकिन इस्तेमाल किए बिना भी बुरा हो सकता है। उदाहरण के लिए, पूल में एक प्रबंधित प्रबंधित कनेक्शन अमान्य हो सकता है क्योंकि अंतर्निहित भौतिक कनेक्शन का समय समाप्त हो गया है। ऐप सर्वर आमतौर पर यह जांचने के लिए एक सुविधा होती है कि प्रबंधित कनेक्शन वैध है या नहीं, इससे पहले कि इसका उपयोग शुरू हो जाए।यदि नहीं, तो यह पूल से एक और प्रबंधित कनेक्शन आज़माएगा, या एक नया बना देगा।
क्या आप किसी विशेष डेटाबेस को लक्षित कर रहे हैं, या क्या किसी भी जेडीबीसी से जुड़े डेटाबेस के लिए इसे सामान्यीकृत समाधान की आवश्यकता है? – kgrittn
मैं अभी डीबी 2 और डीबी 2 जेड/ओएस का उपयोग कर रहा हूं। – Andy
एंडी, डेटाबेस विफलता अनुकरण करने के लिए कौन सी विधि आप चुनते हैं? – dmiandre