jdbc java.sql.preparedstatement在插入期间复制行

时间:2016-09-02 19:40:39

标签: java scala jdbc ojdbc

我在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

2 个答案:

答案 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();