2010-04-26 10 views
14

Çok sayıda küçük satırı Oracle'a hızla eklemem gerekiyor. (5 alan).Java'dan Oracle'a toplu eklenti ekle

MySQL ile, ekleri 100'lü gruplara ayırırım, sonra 100 ek grubunun her grubu için bir tane ekleme deyimi kullanın.

Ancak Oracle ile kullanıcı geri bildirimleri, kitle eklerinin (1000-30000 arasında) çok yavaş olmasıdır.

Java'dan programlı eklemeleri Oracle'a hızlandırmak için kullanabileceğim benzer bir numara var mı?

+0

Yapı SQLPlus komut. –

cevap

0

Günümüzde MySQL, Oracle yüzden belki daha basit bir çözüm MySQL üzerinde kalmak olabilir olduğunu ...

grubudur kez, ekler grubunuzu başlamadan önce, işlem başlatılmadan emin olmalısınız değil o takdirde İşlemi tamamladıktan sonra işlemi gerçekleştirin ve sonraki grup için yeni bir işlem başlatın. Ayrıca, ekleme süresini yavaşlatabilecek gereksiz dizin tanımları olup olmadığını da kontrol edin.

Güncelleme ...
Toplu ekleme (Extract Load Transform) ETL son adımında atıfta böylece bir java tabanlı ETL aracı gibi pentaho kettle veya talend-studio kullanarak kabul var.

Pentaho, Oracle Toplu Yükleme Tesislerini here tanımlamaktadır.

Hızlı bir Google ayrıca, Talend'in Oracle toplu yüklemesi için bazı desteklerinin olduğunu gösteren bazı ön kanıtları gösterir.

+4

MySQL açıkçası Oracle değil. Şirket ama yazılım değil. Ayrıca, müşterinin tercihi. MySQL'i tercih ediyorum ama ikisini de desteklememiz gerekiyor. –

+0

Sadece onaylamak için, zaten tek bir işlem içinde. –

+1

MySQL'de kalmayla ilgili yorum, çünkü Oracle, bir şaka olarak ele alınmak istendi ... bir çeşit ... ... tekrar gittim ... – crowne

2

Bu kayıtları veritabanına nasıl geçirdiğinizden emin değilsiniz. En iyi yol bir dizi kullanmaktır, çünkü bu Oracle'ın çok sayıda şık FORALL toplu işlemine izin verir.

Bu örnek paketin iki yordamı vardır. Biri T23 kayıtlarının bir koleksiyonunu (beş sayısal sütun içeren bir tablo) ve bir dizi bir dizi kullanarak bu tabloya kayıt ekleyen bir tanesi doldurur.

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> 

Ben tüm kullanıcıların fakat en zorlu razı etmeleri 0.15 saniyede 100.000 kayıt eklenmesi düşünüyorum: Burada

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> 

bazı örnek çalışır çıkışı olmaz. Öyleyse soru şu, eklerinize nasıl yaklaşıyorsunuz?

+1

Teşekkürler! Java'dan jdbc ile, bu benim tek kısıtlama. –

10

Spring'in DAO modülünü çok sayıda satır eklemek için kullanabilirsiniz.

bir güncellemesinde veritabanına nesneleri Düzenin bir koleksiyon ekler Bir örnek: Java/vb Java üzerinden tüm yapıyor ziyade aramak için,

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

bilmek güzel. Burada bahar kullanmıyorum ama bunu akılda tutacak. –

+0

Bu çözümün bir avantajı, tüm verileri en sonunda büyük bir paket olarak göndermesidir. Her satır için güncellemeler yapıyorsanız, ağa da gönderirsiniz. JPA ayrıca bu Spring çözümü olarak benzer parti çözümleri sunmaktadır. – Espen