我有两个数字集的庞大数据集〜需要一次批量处理数百万个。
使用对象的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();
有没有什么方法可以更快地将其添加到数据库中?
答案 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();
}
});