gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:16:53 25 4
gpt4 key购买 nike

我有一个 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

最佳答案

是的,缺少clearBatch。

executeBatch() 最后调用clearBatch()。但不能保证在其他实现中完全相同。

另外,如果需要的话,我会对 tchoedak 的答案做一些细微的补充:)

ps.executeBatch();
conn2.commit();
ps.clearBatch();

关于java - jdbc java.sql.preparedstatement 在插入期间复制行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39299660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com