db2 无法关闭数据库连接

fcg9iug3  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(520)

我正在开发一个基于Java的实用程序,它可以将一些列值从一个表迁移到另一个表。我的第一个表包含一个ID列,其值是固定类型的(例如,Java中的一些枚举类型,它们在第一个表中插入)
以下是我正在遵循的步骤总结:
1.正在获取新的数据库连接并将autocommit设置为false。
1.从第一个表中选择ID的唯一类型。
1.为每个唯一ID创建一个线程池。在提交迁移作业时,我将相同的数据库连接传递给先前获得的每个线程。
1.每个线程都将值从第一个表迁移到第二个表,最后每个线程都执行数据库提交。
1.到目前为止,我的主线程都在等待future.get()。
1.一旦所有的线程都完成了,我就用我的主线程删除第一个表(并执行显式提交)并关闭连接。
Oracle、UDB和ZOS数据库支持此实用程序,并且在Oracle和UDB中运行良好。但是,对于ZOS数据库,在关闭数据库连接时,我遇到以下异常:

com.ibm.db2.jcc.a.SqlException: [jcc][t4][10251][10308][3.52.90] java.sql.Connection.close() requested while a transaction is in progress on the connection.
The transaction remains active, and the connection cannot be closed.
ERRORCODE=-4471, SQLSTATE=null

1.在这里,在我的主线程中,我首先删除表,然后关闭连接,这样就以一种顺序的方式完成了这些操作。那么为什么我会得到上面的异常呢?我做错了什么?
1.当我将autocommit设置为false时,是否需要为DROP进行显式提交?

t2a7ltrp

t2a7ltrp1#

在Db2中,在关闭数据库连接之前,你需要用COMMIT或ROLLBACK来提交事务。COMMIT和ROLLBACK只在你对数据库数据进行更改时才执行,例如'INSERT和DELETE,而COMMIT和ROLLBACK用于只引用数据的SELECT。我相信有很多人没有注意到-,但至少在Db2中,即使是在SELECT'的情况下,你也需要注意事务。
在上面的源代码中,自动提交是关闭的(con.setAutoCommit(false))。如果auto-commit = true,jdbc驱动程序将在您调用Connection::关闭,但如果auto-commit = false,程序员将显式地使用Connection::commit或。如果不调用Connection::换句话说,在上面的源代码中,我们关闭了自动提交,所以我们试图在不确认事务的情况下关闭连接,结果是'ERRORCODE = -4471'。

相关问题