2012-10-15 12 views
5

मैं अपने डेटाबेस है कि बिल्कुल ठीक काम कर रहा था क्वेरी करने के लिए इस तरह अब तक कुछ उपयोग कर रहा था:ResultSet के ओरेकल JDBC प्रदर्शन

PreparedStatement prepStmt = dbCon.prepareStatement(mySql); 
ResultSet rs = prepStmt.executeQuery(); 

लेकिन तब मैं क्रम में rs.first(); का उपयोग करने के लिए आवश्यक से अधिक पुनरावृति करने में सक्षम हो मेरी rs कई बार। तो अब मैं

PreparedStatement prepStmt = dbCon.prepareStatement(mySql,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);  

मेरा प्रश्न दोनों के प्रदर्शन से संबंधित है। यदि मैं दूसरा विकल्प उपयोग करता हूं तो मैं क्या खो सकता हूं? दूसरे विकल्प का उपयोग करने वाले कोड में अब तक कोई नकारात्मक प्रभाव डालेगा?

पीएस: ध्यान दें कि मेरा आवेदन एक बहु-उपयोगकर्ता, डेटाबेस-गहन वेब एप्लिकेशन (वेबलॉगिक 10.3.4 पर) है जो बैक एंड ओरेकल 11 जी डेटाबेस का उपयोग करता है।

आपके ध्यान के लिए धन्यवाद।

अद्यतन

मेरे अधिकतम reslutset आकार कम 1000 से पंक्तियों और 15-20 कॉलम

+0

क्यों ResultSet से एक 'सूची ' निर्माण और उसके बाद का उपयोग कर कि POJO बजाय, जहाँ भी आप चाहते हैं, एक विकल्प नहीं है? तुलनात्मक रूप से 'सूची ' को संभालना हमेशा आसान होता है। मेरा मतलब डेटा-प्रकार की सामग्री है, कॉलम की संख्या गुजरती है, या नाम, वहां लागू नहीं होता है। –

+0

हां, सवाल पूछते समय मुझे यही दिमाग था। यदि मेरे पास कोई प्रदर्शन समस्या है तो मैं निश्चित रूप से इस दृष्टिकोण का उपयोग – MaVRoSCy

+0

@AdeelAnsari का उपयोग करूंगा, जो परिणामसेट का विकल्प नहीं हो सकता है। – Santosh

उत्तर

3

हो जाएगा के बाद से एक Oracle कर्सर, एक आगे की केवल संरचना है आदेश एक स्क्रॉल कर्सर अनुकरण में, जेडीबीसी ड्राइवर को आम तौर पर परिणामों को कैश करने की आवश्यकता होती है यदि वह यह सुनिश्चित करने में सक्षम होना चाहता है कि जब आप दूसरी बार परिणामों के माध्यम से पुन: प्रयास करते हैं तो वही परिणाम लौटाए जाते हैं। क्वेरी से लौटाए गए परिणामों की संख्या और आकार के आधार पर, इसमें एप्लिकेशन सर्वर पर पर्याप्त मात्रा में अतिरिक्त स्मृति शामिल हो सकती है। दूसरी ओर, इसका मतलब यह होना चाहिए कि ResultSet के माध्यम से दूसरी बार पहली बार की तुलना में अधिक कुशल होना चाहिए।

क्या अतिरिक्त मेमोरी आवश्यक है आपके आवेदन पर सार्थक निर्भर करता है। आप कहते हैं कि सबसे बड़ा ResultSet में 1000 पंक्तियां होंगी। यदि आप समझते हैं कि प्रत्येक पंक्ति 500 ​​बाइट्स है (यह स्पष्ट रूप से डेटा प्रकारों पर निर्भर करेगी - यदि आपके ResultSet में केवल संख्याओं का समूह है, तो यह बहुत छोटा होगा, यदि इसमें लंबे विवरण स्ट्रिंग का समूह है, तो यह बहुत बड़ा हो सकता है), 1000 पंक्ति प्रति उपयोगकर्ता 500 केबी है। यदि आपके पास 1000 एक साथ उपयोगकर्ता हैं, तो यह केवल 500 एमबी स्टोरेज है जो शायद निषिद्ध नहीं है। यदि आपके पास 1 मिलियन एक साथ उपयोगकर्ता हैं, तो दूसरी ओर, यह 500 जीबी है जिसका शायद मतलब है कि आप कुछ नए सर्वर खरीद रहे हैं। यदि आपकी पंक्तियां 500 की बजाय 5000 बाइट्स हैं, तो आप 5 जीबी रैम के बारे में बात कर रहे हैं जो आपके एप्लिकेशन को चलाने के लिए एप्लिकेशन सर्वर पर आवश्यक मेमोरी का एक बड़ा हिस्सा हो सकता है।

+0

तो आप क्या सुझाव देंगे? – MaVRoSCy

+0

@MaVRoSCy - यह आपकी आवश्यकताओं पर निर्भर करता है। यदि आपका 'परिणामसेट' छोटा है और आपके पास एप्लिकेशन सर्वर पर बहुत सी रैम है, तो स्क्रॉल करने योग्य परिणाम सेट का उपयोग करना पूरी तरह से उचित हो सकता है। यदि नहीं, तो आपको अन्य विकल्पों पर विचार करने की आवश्यकता हो सकती है। कुछ सिस्टम 'ResultSet' को बंद और फिर से खोलने में सक्षम हो सकते हैं जो ओरेकल को क्वेरी को फिर से निष्पादित करने के लिए मजबूर करता है और यदि पहली क्वेरी निष्पादित की गई थी तो परिवर्तन किए जाने पर अलग-अलग परिणाम मिल सकते हैं। कुछ सिस्टम स्थानीय संग्रह में डेटा के एक सबसेट (यानी कॉलम का सबसेट) कैश करने में सक्षम हो सकते हैं। –

9

आप scrollability (आपका दूसरा विकल्प) का उपयोग कर रहे हैं, यह करने के लिए ध्यान देना: एक स्थिति है जहाँ क्योंकि किसी भी स्क्रॉल परिणाम सेट की सभी पंक्तियों में क्लाइंट-साइड कैश जमा हो जाती है:

महत्वपूर्ण परिणाम सेट में कई पंक्तियां, कई कॉलम, या बहुत बड़े कॉलम क्लाइंट-साइड जावा वर्चुअल मशीन (JVM) विफल होने के कारण हो सकते हैं। बड़े परिणाम सेट के लिए स्क्रॉलिबिलिटी निर्दिष्ट न करें।

स्रोत: Oracle Database JDBC Developer's Guide and Reference

+0

वह वास्तव में सहायक था, धन्यवाद – MaVRoSCy

+0

आपका स्वागत है! –

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