我在scala中有一个程序,它使用ojdbc连接到oracle数据库,查询表,并尝试将java.sql.resultSet中的记录插入到另一个jdbc连接上的另一个表中。
//conn1 to oracle: java.sql.Connection = oracle.jdbc.driver.T4CConnection@698122b2
//conn2 to another non-oracle database: java.sql.Connection = com.snowflake.client.jdbc.SnowflakeConnectionV1@6e4566f1
我尝试从oracle表中捕获结果:
val stmt1 = conn1.createStatement()
stmt1.setFetchSize(3000)
val sql1 = "select userid from nex.users"
val result = stmt1.executeQuery(sql1)
和尝试通过jdbc:
将结果中的记录插入到单独的数据库和表中的代码val insert_sql = "insert into test.users (userid) values (?)"
val ps = conn2.prepareStatement(insert_sql)
val batchSize = 3000
var count = 0
while (result.next) {
ps.setInt(1, result.getInt(1))
ps.addBatch()
count += 1
if (count % batchSize == 0) ps.executeBatch()
}
在我使用jdbc的许多示例中,这几乎是完全相同的语法,但是在我的第二个表中,我看到第一个表中原始行数的4倍。
select userid, count(*) from test.users group by userid
1 4
2 4
3 4
4 4
5 4
6 4
etc
答案 0 :(得分:0)
问题是我需要在每次执行后执行var obj = new Electronic1();
if (obj.CanRunController())
obj.ThisPaymentGateway.Process(ref obj);
,否则下一批将在上一批次之上堆积。在需要更频繁地调用executeBatch的大型表上尝试此操作时,重复行的数量是x倍。最终代码看起来很相似,但ps.clearBatch()
。
ps.clearBatch()
答案 1 :(得分:0)
是的,缺少clearBatch。
executeBatch()最后调用clearBatch()。 但是不能保证在其他实现中完全相同。
另外,如果需要的话,我会对tchoedak的回答进行微妙的补充:)
ps.executeBatch();
conn2.commit();
ps.clearBatch();