2012-08-23 7 views
8

का उपयोग करने से 10 गुना तेज है। मैं नेट और जावा का उपयोग कर ओरेकल डीबी से 1 एमएलएन रिकॉर्ड पढ़ रहा हूं। नेट में मैं ODP.Net का उपयोग कर रहा हूं, जावा ojdbc6 पतली क्लाइंट में। नेट रीडिंग डेटा में लगभग 10 सेकंड लगते हैं, और जावा में लगभग 2 मिनट लगते हैं। इतना बड़ा अंतर क्यों है?नेट का उपयोग करते हुए ओरेकल डीबी से डेटा पढ़ना जावा

नेट:

यहाँ एक कोड है

 try 
     { 
      DateTime dt1 = DateTime.Now; 

      OracleConnection con = new OracleConnection(); 
      con.ConnectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=myHost)(PORT=myPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=myService)));User Id=myId;Password=myPass;"; 

      con.Open(); 
      string cmdQuery = "SELECT * FROM DROPME"; 

      OracleCommand cmd = new OracleCommand(cmdQuery); 
      cmd.Connection = con; 
      cmd.CommandType = CommandType.Text; 

      int i = 0; 
      OracleDataReader reader = cmd.ExecuteReader(); 
      while (reader.Read()) 
      { 
       Object o1 = reader.GetValue(0); 
       Object o2 = reader.GetValue(1); 
       Object o3 = reader.GetValue(2); 
       Object o4 = reader.GetValue(3); 
       Object o5 = reader.GetValue(4); 
       Object o6 = reader.GetValue(5); 
       Object o7 = reader.GetValue(6);      
       i++; 
      } 

      DateTime dt2 = DateTime.Now; 

      double elapsed = (dt2 - dt1).TotalSeconds; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 

जावा:

try 
    { 
     long t0 = System.currentTimeMillis(); 
     oracleDataSource = new OracleDataSource(); 
     oracleDataSource.setURL("jdbc:oracle:thin:myId/[email protected]:myPort:myService"); 
     Connection connection = oracleDataSource.getConnection(); 
     PreparedStatement statement = connection.prepareStatement("SELECT * FROM DROPME"); 
     ResultSet result = statement.executeQuery(); 
     int i = 0; 
     while (result.next()) 
     { 
      result.getObject(1); 
      result.getObject(2); 
      result.getObject(3); 
      result.getObject(4); 
      result.getObject(5); 
      result.getObject(6); 
      result.getObject(7); 
      i++; 
     } 
     long t1 = System.currentTimeMillis(); 
     long elapsed = (t1 - t0)/1000; 
     int t = 0; 
    } 
    catch (Exception ex) 
    { 
     ex.printStackTrace(); 
    } 

संपादित करें: setFetchSize() काम किया है, धन्यवाद।

+3

सिर्फ अनुमान लगा: जावा में आप एक विशेष मूल क्लाइंट "ऐसे किसी भी स्तर" के साथ सिर्फ एक JDBC-ड्राइवर का उपयोग कर रहे, .net में ... लेकिन सामान्य तौर पर, .net तेजी से होता है;) – TheHe

+2

मुझे लगता है कि आप एक दोषपूर्ण आधार से शुरू कर रहे हैं: कि जावा तेज़ हो सकता है। –

उत्तर

8

डिफ़ॉल्ट रूप से जावा में, परिणामसेट पूरी तरह से पुनर्प्राप्त और स्मृति में संग्रहीत हैं। बड़े परिणामसेट्स के साथ पूछताछ के लिए यह अच्छा नहीं है। स्ट्रीम किए गए परिणाम का उपयोग करने के लिए आपको इसका उपयोग करना होगा:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); 
stmt.setFetchSize(Integer.MIN_VALUE); 

मैंने समय लेने की तुलना नहीं की है, लेकिन मुझे लगता है कि यह बहुत तेज होगा।

+0

क्या आप वाकई हैं कि परिणामसेट पूरी तरह से पुनर्प्राप्त और स्मृति में संग्रहीत हैं? क्या जेडीबीसी मानक का यह हिस्सा है या यह व्यवहार है जिसे आपने कुछ जेडीबीसी ड्राइवरों पर देखा है? –

+0

मैं इसे सट्टेबाजी के बिना भी कोशिश करूंगा ... या आप डेटा को डेटासेट में डेटा लोड करने के लिए परीक्षण कर सकते हैं। नेट, लूप करें और देखें कि इसमें 2 मिनट लगते हैं या नहीं। जानना दिलचस्प ... – Asken

+0

@ एडम हाँ मुझे यकीन है। और जैसा कि आपने अनुमान लगाया है, यह जेडीबीसी ड्राइवरों का डिफ़ॉल्ट व्यवहार है। –

6

मेरे अनुभव में, ओरेकल जेडीबीसी ड्राइवर बड़े पैमाने पर स्थानांतरण के लिए ऑफ-द-द-बॉक्स को कॉन्फ़िगर किया गया है। डिफ़ॉल्ट रूप से, यह केवल एक समय में नेटवर्क में 10 रिकॉर्ड स्थानांतरित करता है। इसलिए, यदि आपके पास 1,000,000 रिकॉर्ड हैं, तो ड्राइवर को 100,000 नेटवर्क एक्सेस होंगे।

आप ResultSet बता सकते हैं कि कितने रिकॉर्ड इस कोड के साथ एक समय में लाने के लिए:

result.setFetchSize(1000); 

विभिन्न आकारों के साथ प्रयोग करने के लिए स्वतंत्र महसूस करें। मैंने कम से कम एक एप्लिकेशन में कामकाजी समय (मिनटों से सेकंड तक) नाटकीय रूप से कम किया है।

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