2010-12-09 11 views
5

का उपयोग किए बिना जेडीबीसी कनेक्शन को कैसे पास किया जाए हमारे पास जावा जे 2 ईई एप्लीकेशन है जो प्रत्येक डेटाबेस पंक्ति सम्मिलन/अद्यतन के लिए व्यक्तिगत वेब सेवा कॉल का उपयोग कर रहा था। यह बहुत धीमा तरीका बन गया। उन्होंने मुझे इसे "जल्दी" ठीक करने के लिए लाया है। मैं सभी वेब सेवा कॉल को सादा जेडीबीसी में बदलने की योजना बना रहा हूं। ऐसा करने के लिए, मुझे पूल से जेडीबीसी कनेक्शन प्राप्त करने की आवश्यकता है और फिर इसे कई अलग-अलग तरीकों से उपयोग करें। मुझे एक ही डेटाबेस लेनदेन में एक साथ स्ट्रिंग करने के लिए एकाधिक डीएओ में एक ही जेडीबीसी कनेक्शन का उपयोग करने की आवश्यकता है। मैं स्पष्ट रूप से प्रत्येक डीएओ को जेडीबीसी कनेक्शन के आसपास पास कर सकता हूं, जिसकी आवश्यकता है, लेकिन इसके लिए मुझे बहुत सी विधि हस्ताक्षर बदलने की आवश्यकता होगी, साथ ही यूनिट परीक्षणों का एक बहुत कुछ (जो "जल्दी" भाग के खिलाफ जाता है)।स्प्रिंग/जेपीए/हाइबरनेट

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

उत्तर

1

आप थ्रेडलोकल का उपयोग कर सकते हैं। प्रवेश बिंदु इसे सेट अप और DAOs

class ConnectionUtil { 
    public static final ThreadLocal<Connection> connection = new ThreadLocal<Connection>(); 
} 

public Return method(Args arg) { 
    ConnectionUtil.connection.set(newConnection()); 
    try { 
     ... 
    } finally { 
     ConnectionUtil.connection.remove(); 
    } 
} 

सुंदर बदसूरत से है, लेकिन है कि क्या अपने मालिक चाहता है हो रहा है।

+0

यह हमारे लिए वास्तव में अच्छा काम कर सकता है। क्या इस तरह से कोई बड़ा प्रदर्शन समस्या है? – Shane

+0

थ्रेडलोकल थोड़ी देर के लिए सूर्य से प्रदर्शन सुधार का लक्ष्य रहा है। डीबी संचालन की तुलना में, यह एक गोल त्रुटि होगी। – sblundy

1

हमने पहले ऐसा किया है (5 साल पहले या तो आईबीएम वेबस्पेयर पर)। हमने अपना पूल लिखा और सत्र आईडी के साथ हैशटेबल में जेडीबीसी-कनेक्शन संग्रहीत किया। सत्रक पर कनेक्शन को बंद करना और इसे पूल में वापस करना था (हमने सत्रसूचीकर्ता के साथ ऐसा किया)। यदि एक उपयोगकर्ता सत्र केवल एक जेडीबीसी कनेक्शन से जुड़ता है, तो थ्रेड सुरक्षा विरासत में प्राप्त होती है। तो सिंगलटन दृष्टिकोण निश्चित रूप से काम करता है। हमारा प्रदर्शन लाभ भयानक था।

2

Apache Commons DBCP का उपयोग करें। यह अपाचे से कनेक्शन पूल प्रोजेक्ट है, और कई इंजनों में आंतरिक रूप से इसका उपयोग किया जाता है।

+1

मैं समझता हूं कि अपाचे कॉमन्स डीबीसीपी कनेक्शन के पूल को बनाए रखने में मदद करता है, लेकिन मुझे समान कनेक्शन को पकड़ने में सक्षम होने के लिए प्रत्येक व्यक्तिगत डीएओ डालने/अपडेट/डिलीट विधि की आवश्यकता होती है। क्या डीबीसीपी उसमें मदद कर सकता है? क्या कहीं कोई उदाहरण है? मैंने कई Google खोजे और कुछ भी नहीं मिला। – Shane

0

इसके अतिरिक्त मैंने डीएओ के लिए जो किया है, वह विधि हस्ताक्षर में कनेक्शन को पास नहीं करना है बल्कि इसके बजाय कन्स्ट्रक्टर में है। फिर मैं उस ऑब्जेक्ट को पकड़ता हूं जो मूल रूप से इसे बंद करने के लिए जिम्मेदार कनेक्शन बनाता है।