首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Java大容量插入到Oracle

从Java大容量插入到Oracle
EN

Stack Overflow用户
提问于 2010-04-27 04:56:18
回答 4查看 47.3K关注 0票数 15

我需要在Oracle中快速插入许多小行。(5个字段)。

使用MySQL时,我将插入分为100个一组,然后对每100个插入一组使用一条insert语句。

但是对于Oracle,用户的反馈是大容量插入( 1000-30000)太慢。

有没有类似的技巧可以用来加速从Java到Oracle的编程插入?

EN

回答 4

Stack Overflow用户

发布于 2010-04-28 05:47:51

您可以使用Spring的DAO模块批量插入多行。

以下示例在一次更新中将Order对象的集合插入到数据库中:

代码语言:javascript
复制
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);
    }
}
票数 11
EN

Stack Overflow用户

发布于 2010-04-27 09:17:16

您没有说明如何将这些记录传递到数据库。最好的方法是使用数组,因为这允许使用Oracle的大量FORALL批量操作。

这个示例包有两个过程。一个填充T23记录的集合(包含五个数字列的表),另一个使用数组将记录批量插入到该表中。

代码语言:javascript
复制
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>

以下是一些示例运行的输出:

代码语言:javascript
复制
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条记录应该会让大多数要求最苛刻的用户满意。所以,问题是,如何处理插入?

票数 2
EN

Stack Overflow用户

发布于 2010-04-27 05:24:38

现在MySQL是甲骨文,所以也许更简单的解决方案可能是继续使用MySQL……

如果没有,则应确保在开始插入组之前启动事务,一旦组完成,则提交事务并为下一组插入启动一个新事务。

还要检查可能会减慢插入时间的不必要的索引定义。

已更新...

批量插入指的是ETL (提取转换加载)的最后一步,因此您是否考虑过使用基于java的ETL工具,如pentaho kettletalend-studio

Pentaho描述了他们的Oracle批量装载设施here

快速google还显示了一些初步证据,表明Talend也支持Oracle批量加载。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2716818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档