将巨大的数据集添加到Oracle数据库中

时间:2014-10-23 21:19:00

标签: java oracle jdbc dataset

我有两个数字集的庞大数据集〜需要一次批量处理数百万个。

使用对象的ArrayList是将这些对象存储到内存然后存储到数据库中的最佳方法

List<Object> objects = new ArrayList<Object>()
objects.add(new Object("101", "101"))

然后我使用Spring的jdbcTemplate将这些项目逐个读入数据库。

for(Object object: objects) 
jdbcTemplate.update("INSERT INTO TABLEOFNUMBERS(ITEM1, ITEM2) values(?, ?)", object.get1(), object.get2();

有没有什么方法可以更快地将其添加到数据库中?

3 个答案:

答案 0 :(得分:1)

如果数据源是文件,最好完全绕过您的OO语言/工具并使用Oracle的实用程序SQL Loader。 如果必须创建单独的SQL INSERT语句,并且Oracle版本为11gR2或更高版本,请尝试APPEND_VALUES提示,如下所示:     INSERT / * + APPEND_VALUES * / INTO TABLEOFNUMBERS ...... 这样做了直接路径插入,比传统路径更有效,因为它绕过了Oracle的SGA内存中的缓冲区缓存,而是将块直接写入数据文件。 这是关于APPEND_VALUES的另一篇文章: http://www.oracle-base.com/articles/11g/append-values-hint-11gr2.php

答案 1 :(得分:1)

使用jdbc(而不是某些oracle批量加载程序)时,INSERT成本可能很难解决,但您可以通过减少数百万次网络往返来节省大量时间。您可以尝试创建一个一次加载20个PLSQL块或存储过程(20个插入每个块并使用它自己的绑定变量以避免重新分析)。

APPEND_VALUES也可能有助于插入所需的时间,但由于删除,它不会重复使用表中的可用空间。这可能会导致表格过度增长。

答案 2 :(得分:0)

这就是我最终使用Spring的JDBC模板进行操作的方法。

jdbcTemplate.batchUpdate("INSERT INTO TABLEOFNUMBERS(ITEM1, ITEM2) values (:1, :2)",
                new BatchPreparedStatementSetter() {
            public void setValues(PreparedStatement ps, int i ) throws SQLException {
                ps.setString(1, batch.get(i).getITEM1());
                ps.setString(2, batch.get(i).getITEM2());
            }

            public int getBatchSize() {
                return batch.size();
            }
        });