2010-06-12 10 views
6

मैं यह पता लगाने की कोशिश कर रहा हूं कि मेरे डेटाबेस के निर्माण के दौरान मेरे सभी कथन कैश करना मेरे लिए सक्षम है या यदि मुझे केवल उन लोगों को बनाना चाहिए जो अधिकतर उपयोग किए जाते हैं और दूसरों को बनाते हैं 'फिर से की जरूरत ..क्या तैयारी के लिए इसे महंगा रखना महंगा है? (जावा और जेडीबीसी)

यह ग्राहक धागे के सभी में सभी बयानों की बनाने के लिए मूर्ख लगता है। किसी भी प्रतिक्रिया की काफी सराहना की जाएगी।

उत्तर

9

थोड़ा सभ्य डेटाबेस पहले से ही उन्हें कैश करेगा। इस समय आपको वास्तव में क्वेरी निष्पादित करने की आवश्यकता होने पर Connection#prepareStatement() आग लगें। आपके पास वास्तव में कोई अन्य विकल्प नहीं है क्योंकि कनेक्शन, कथन और परिणामसेट को में सबसे कम संभव स्कोप में अधिग्रहण और बंद करना चाहिए, यानी try-finally ब्लॉक में उसी विधि में ब्लॉक करें जब आप क्वेरी निष्पादित करते हैं।

बदले में प्रत्येक क्वेरी पर कनेक्शन खोलना और बंद करना महंगा हो सकता है। इसका एक सामान्य समाधान connection pool का उपयोग कर रहा है, उदाहरण के लिए c3p0

2

यह मुझे समयपूर्व अनुकूलन की तरह लगता है कि जब तक मेरे पास कुछ जानकारी नहीं है, तो यह मुझे बताएगा कि यह महत्वपूर्ण है। यदि आपकी डेटाबेस पहुंच अक्षम है, तो मुझे तैयार स्कीम कैशिंग के बारे में सोचने से पहले आपकी स्कीमा या मानों तक पहुंच पर संदेह होगा।

4

मुझे लगता है कि आप बहुत ज्यादा, तैयार बयान में चिंता कर रहे हैं पहले से ही कैशिंग के कई स्तर से लाभ: डेटाबेस स्तर पर

  • : एक सभ्य डेटाबेस किसी दिए गए बयान के लिए तैयार पहुँच योजना का पुन: उपयोग होगा।
  • कनेक्शन पूल स्तर पर: एक सभ्य कनेक्शन पूल पूल में प्रत्येक डेटाबेस कनेक्शन के लिए PreparedStatement ऑब्जेक्ट्स कैश करेगा (और कनेक्शन पर preparedStatement पर बाद में कॉल पर कैश किए गए PreparedStatement को वापस कर देगा)।

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