2010-04-26 14 views
14

में थोक डालने के लिए मुझे ओरेकल में तेजी से कई छोटी पंक्तियां डालने की आवश्यकता है। (5 फ़ील्ड)।जावा से ओरेकल

MySQL के साथ, मैंने 100 के समूहों में आवेषण तोड़ दिया, फिर 100 प्रविष्टियों के प्रत्येक समूह के लिए एक सम्मिलित कथन का उपयोग करें।

लेकिन ओरेकल के साथ, उपयोगकर्ता प्रतिक्रिया यह है कि द्रव्यमान सम्मिलन (1000-30000 से कहीं भी) बहुत धीमी है।

क्या एक समान चाल है जिसका उपयोग मैं जावा से ओरेकल में प्रोग्रामेटिक आवेषण को तेज करने के लिए कर सकता हूं?

+0

sqlplus बिल्ड स्क्रिप्ट, जावा/आदि जावा के माध्यम से यह सब कर के बजाय कॉल करने के लिए। –

उत्तर

0

आजकल MySQL Oracle तो शायद एक सरल समाधान MySQL पर रहने के लिए हो सकता है ...

यदि नहीं तो आप इससे पहले कि आप, आवेषण के अपने समूह शुरू एक बार समूह है सुनिश्चित करें कि लेन-देन शुरू कर दिया है बनाना चाहिए समाप्त हो गया तो लेनदेन प्रतिबद्ध करें और अगले समूह के आवेषण के लिए एक नया लेनदेन शुरू करें।

अनावश्यक सूचकांक परिभाषाओं की भी जांच करें जो सम्मिलित समय को धीमा कर सकते हैं।

अपडेट किया गया ...
थोक डालने (निकालें लोड रूपांतरण) ETL के अंतिम चरण के लिए संदर्भित करता है, तो आप एक जावा आधारित ETL उपकरण जैसे pentaho kettle या talend-studio का उपयोग कर विचार किया है।

पेंटाहो अपने ओरेकल थोक लोडिंग सुविधाओं here का वर्णन करता है।

एक त्वरित Google कुछ प्रारंभिक सबूत भी दिखाता है कि Talend को ओरेकल थोक लोडिंग के लिए कुछ समर्थन भी है।

+4

MySQL स्पष्ट रूप से ओरेकल नहीं है। कंपनी है, लेकिन सॉफ्टवेयर नहीं है। इसके अलावा - यह ग्राहक की पसंद है। मैं MySQL पसंद करता हूं लेकिन हमें दोनों का समर्थन करने की आवश्यकता है। –

+0

बस पुष्टि करने के लिए, यह पहले से ही एक ही लेनदेन के भीतर है। –

+1

MySQL पर रहने के बारे में टिप्पणी क्योंकि यह ओरेकल को मजाक के रूप में लिया जाना था ... सॉर्ट-ऑफ ... वहां मैं फिर से जाता हूं ... – crowne

2

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

इस उदाहरण पैकेज में दो प्रक्रियाएं हैं। एक जो T23 रिकॉर्ड्स (एक तालिका जिसमें पांच संख्यात्मक कॉलम शामिल हैं) का संग्रह पॉप्युलेट करता है और वह एक जो सरणी का उपयोग करके उस तालिका में रिकॉर्ड करता है।

SQL> declare 
    2  l_array p23.t23_nt; 
    3 begin 
    4  l_array := p23.pop_array(500); 
    5  p23.ins_table(l_array); 
    6  l_array := p23.pop_array(1000); 
    7  p23.ins_table(l_array); 
    8  l_array := p23.pop_array(2500); 
    9  p23.ins_table(l_array); 
10  l_array := p23.pop_array(5000); 
11  p23.ins_table(l_array); 
12  l_array := p23.pop_array(10000); 
13  p23.ins_table(l_array); 
14  l_array := p23.pop_array(100000); 
15  p23.ins_table(l_array); 
16 end; 
17/
loaded 500 recs in 0 csecs 
loaded 1000 recs in 0 csecs 
loaded 2500 recs in 0 csecs 
loaded 5000 recs in 1 csecs 
loaded 10000 recs in 1 csecs 
loaded 100000 recs in 15 csecs 

PL/SQL procedure successfully completed. 

SQL> 
SQL> select count(*) from t23 
    2/

    COUNT(*) 
---------- 
    119000 

SQL> 

मैं 0.15 सेकंड में 100,000 रिकॉर्ड डालने सभी लेकिन अधिकांश उपयोगकर्ताओं की मांग को खुश होना चाहिए लगता है:

SQL> create or replace package p23 as 
    2  type t23_nt is table of t23%rowtype; 
    3  function pop_array (p_no in number) 
    4   return t23_nt; 
    5  procedure ins_table (p_array in t23_nt); 
    6 end p23; 
    7/

Package created. 

SQL> create or replace package body p23 as 
    2 
    3  function pop_array (p_no in number) 
    4   return t23_nt 
    5  is 
    6   return_value t23_nt; 
    7  begin 
    8   select level,level,level,level,level 
    9   bulk collect into return_value 
10   from dual 
11   connect by level <= p_no; 
12   return return_value; 
13  end pop_array; 
14 
15  procedure ins_table 
16    (p_array in t23_nt) 
17  is 
18   s_time pls_integer; 
19  begin 
20 
21   s_time := dbms_utility.get_time; 
22 
23   forall r in p_array.first()..p_array.last() 
24    insert into t23 
25    values p_array(r); 
26 
27   dbms_output.put_line('loaded ' 
28     ||to_char(p_array.count())||' recs in ' 
29     ||to_char(dbms_utility.get_time - s_time) 
30     ||' csecs'); 
31  end ins_table; 
32 end p23; 
33/

Package body created. 

SQL> 

यहां कुछ ऐसे नमूना रन से उत्पादन होता है। तो, सवाल यह है कि आप अपने आवेषणों से कैसे संपर्क करते हैं?

+1

धन्यवाद! जावा से जेडीबीसी के साथ, यह मेरी एकमात्र बाधा है। –

10

आप कई पंक्तियों को डालने के लिए स्प्रिंग के डीएओ मॉड्यूल का उपयोग कर सकते हैं।

एक उदाहरण है कि आदेश का संग्रह सम्मिलित करता है एक अद्यतन में डेटाबेस में वस्तुओं:

public class OrderRepositoryImpl extends SimpleJdbcDaoSupport implements 
     OrderRepository { 

    private final String saveSql = "INSERT INTO orders(userid, username, coffee, coffeename, amount) " 
      + "VALUES(?, ?, ?, ?, ?)"; 

    public void saveOrders(final Collection<Order> orders) { 
     List<Object[]> ordersArgumentList = new ArrayList<Object[]>(orders 
       .size()); 

     Object[] orderArguments; 
     for (Order order : orders) { 
      orderArguments = new Object[] { order.getUserId(), 
        order.getUserName(), order.getCoffe(), 
        order.getCoffeeName(), order.getAmount() }; 

      ordersArgumentList.add(orderArguments); 
     } 

     getSimpleJdbcTemplate().batchUpdate(saveSql, ordersArgumentList); 
    } 
} 
+0

जानना अच्छा है। मैं यहां वसंत का उपयोग नहीं कर रहा हूं, लेकिन इसे ध्यान में रखूंगा। –

+0

इस समाधान के साथ एक लाभ यह है कि यह अंत में सभी डेटा एक बड़े पैकेज के रूप में भेजता है। यदि आप प्रत्येक पंक्ति के लिए अद्यतन निष्पादित कर रहे हैं, तो आप नेटवर्क को भी भेजते हैं। जेपीए इस वसंत समाधान के समान बैच समाधान भी प्रदान करता है। – Espen