主要是数据库专家,并且不使用Java进行批量加载等,因为这些操作是由ETL工具或数据库内部工具完成的。
但是,如果我理解正确,工具是由Java / C ++等编写的,它们使用JDBC,ODBC来实现操作。
最近在一个项目中尝试使用JDBC加载批量数据并观察到以下内容。
我们有100万条记录,1.5 Gb数据,表有360列。 从表A读取并尝试在5k的目标表中插入,记录了批处理模式间隔。源abd目标是Oracle。
该项目使用Spring JDBC。我在这里使用了简单的JDBC来单独测试并调试性能问题。 用伪语言描述的逻辑。
prepare statement for Target with
"insert into target values ( ?,?, .. 368 columns);
rs = ( select * from table a );
while rs.next {
stmt.setstring(1, rs.getString("column1");
.
.
360 columns.
stmt.add_batch();
if 5K records then executeBatch();
}
主要问题:
每5K记录所设置的语句大约需要1分钟以上的时间。
因此,仅加载1.5 Gb或100万个rec将花费大约。 4小时。
我正在单线程中执行此操作,但我感觉音量很低。 有没有更好的方法来实现这一目标?
ETL工具说informatica等如何在内部实现?
另一个问题是:有时executeBatch()
对于某些具有相似列数且每条记录有更多卷的表,一次写入5k条记录。在某些情况下,尽管executeBatch
在5k行之后一次性写入了100条记录,并且写入也需要100万条记录的永恒性。
如果我将set语句用作
,则还有另一件事而不是结果集for (I=1 ,I<=1000000; I++)
stmt.setstring(1, rs.getString("123456789");--hardcode value
.
.
360 columns.
stmt.add_batch();
if 5K records then executeBatch();
}
然后,每5k和2-3秒绑定到executeBatch()
大约需要4秒。因此,在20分钟内,我能够加载6到7 GB的数据中的100万。