2009-03-13 15 views
15

मैं बड़ी संख्या में आईडी (पूर्णांक) पुनर्प्राप्त करने के लिए एक प्रश्न कर रहा हूं। परिणामसेट के माध्यम से लाखों बार फिर से शुरू करने और एक-एक-एक को एक ऐरेलिस्ट में कॉपी करने के बजाय, क्या सब कुछ आसानी से एक ArrayList के रूप में पुनर्प्राप्त करने का कोई तरीका है?मैं एक जेडीबीसी परिणामसेट को एक ऐरेलिस्ट के रूप में कैसे प्राप्त कर सकता हूं?

मैं समझता हूं कि परिणामसेट को फिर से चालू किया जाना चाहिए क्योंकि अंतर्निहित कार्यान्वयन कैशिंग सामान हो सकता है, लेकिन मेरी स्थिति में मुझे बस सभी आईडी की आवश्यकता है। मुझे पता है कि मैं FetchSize को बड़ी संख्या में सेट कर सकता हूं, लेकिन फिर भी मुझे आईडी को एक-एक करके पुनर्प्राप्त करना होगा।

स्पष्टीकरण: कारण मैं इसे करना चाहता हूं प्रदर्शन है। प्रोफाइलिंग मुझे दिखाती है कि ResultSet.next(), ResultSet.getInt() और ArrayList.add() लाखों बार करने में काफी समय लगता है। मुझे लगता है कि डेटाबेस (मैं जावा में लिखे गए एच 2 का उपयोग कर रहा हूं) शायद स्मृति में कहीं भी सरणी या सूची है, इसलिए मैं परिणामसेट इटरेटिंग इंटरफ़ेस के बजाय सीधे मुझे कॉपी करने का एक तरीका ढूंढ रहा हूं ।

+1

शायद लाखों इंटीग्रियों से निपटने में काफी समय लगता है। क्या आप इसके बजाय एक int [] या आदिम सूची चाहते हैं? संभावित रूप से अपडेट और सामान्य tableness की वजह से एक int/सूची के रूप में सीधे लागू नहीं किया गया है। –

+0

int [] या सूची दोनों ठीक हैं। मैं मूल रूप से डेटाबेस से कहने का एक तरीका ढूंढ रहा हूं: कैशिंग/आलसी लोडिंग/आदि के बारे में भूल जाओ, बस मुझे जितनी जल्दी हो सके डेटा दें :) – Deckard

+1

एक प्रोफ़ाइल है और देखें कि प्रदर्शन समस्या कहां है। (ओरेकल को अपने परिणामसेट, आईआईआरसी पर कॉलम सरणी विधियां मिलती हैं। यह नहीं कि एच 2 के लिए महत्वपूर्ण है।) –

उत्तर

6

कोड को एक विधि में रखें। यह मेरा सिर के ऊपर बंद

बहुत तरीकों कॉल करने के लिए आसान है ...:

List<Integer> ids = readInts(myStatemnet); 

डन:

public static List<Integer> readInts(
    PreparedStatement statement 
) throws SQLException { 
    ResultSet results = statement.executeQuery(); 
    try { 
     assert results.getMetaData().getColumnCount() == 1; 

     List<Integer> ints = new ArrayList<Integer>(); 
     while (results.next()) { 
      ints.add(Integer.valueOf(results.getInt(1))); 
     } 
     return ints; 
    } finally { 
     results.close(); 
    } 
} 

तो बस के रूप में यह कहते हैं।

+2

यह उस प्रदर्शन में मदद नहीं करता है जो आप अभी भी डेटा के माध्यम से लूप कर रहे हैं। मेरा मानना ​​है कि वह सिर्फ इसे डंप करना चाहता है। –

+1

डेटा के माध्यम से लूप किए बिना आप इसे "डंप" कैसे करेंगे? (प्रश्न का अंतिम अनुच्छेद मूल में नहीं था, बीटीडब्ल्यू।) –

17

अपाचे DbUtils लाइब्रेरी का उपयोग करके आप आसानी से परिणाम सूची को मानचित्र की सूची के रूप में वापस कर सकते हैं।

public List query(String query) { 
    List result = null; 
    try { 
     QueryRunner qrun = new QueryRunner(); 
     result = (List) qrun.query(connection, query, new MapListHandler()); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    return result; 
} 
+0

यह जेडीबीसी को बेहतर प्रदर्शन नहीं करेगा? सहमत है, यह अधिक सुविधाजनक लग रहा है, लेकिन निश्चित रूप से, यह तेज़ नहीं है ...? –

+0

डीबीयूटील्स एक सहायक पुस्तकालय है, इसलिए आप अभी भी जेडीबीसी का उपयोग कर रहे हैं। DbUtils का उपयोग करने के कुछ फायदों के लिए अपनी साइट पर एक नज़र डालें। http://commons.apache.org/dbutils/ – Mark

+0

मैं समझता हूं, फिर भी ओपी ने जवाब देने के बाद प्रश्न बदल दिया है। वे प्रदर्शन सुधारने के लिए जेडीबीसी एपीआई को बाईपास करने का एक तरीका ढूंढ रहे थे ... –

5

आपकी समस्या के साथ

java.sql.Statement.setFetchSize(int) 

100 के साथ प्रयोग, 1000, 10000 यह निष्पादित करने से पहले खराब प्रदर्शन, धुन बयान है, तो .. यह अनावश्यक roundtrips रोक सकता है, के कारण हो सकता है जो आपके द्वारा उल्लिखित धीमापन।

इसके अलावा, ArrayList.add() धीमा हो सकता है अगर इसे कई बार आंतरिक सरणी का आकार बदलना चाहिए, क्योंकि यह एक नई सरणी बनाता है और वहां सभी डेटा कॉपी करता है। इसके बजाय LinkedList आज़माएं।

+0

यदि आप उस fetch आकार को जानते हैं जिसका आप उपयोग करने जा रहे हैं, तो आप ArrayList कन्स्ट्रक्टर में उसी आंतरिक राशि के प्रारंभिक आकार के प्रारंभिक आकार में भी घोषणा कर सकते हैं। –

+1

@Daddy जो मैंने समझा, उससे प्रश्नकर्ता लेखक सभी लौटाई गई आईडी को एक ही सूची में जोड़ रहा था। इसका मतलब है कि आपका सुझाव वास्तव में तब तक मदद नहीं करता जब तक कि आप परिणाम सेट के पूर्ण आकार के साथ सरणी नहीं बनाते, न केवल fetchsize। – Antonio

+1

@ डेकार्ड, इस सवाल का अभी तक कोई स्वीकार्य उत्तर नहीं है, क्या आपने इस समस्या को हल किया? – malatesh

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