关闭数据库连接失败

问题描述 投票:0回答:1

我正在开发一种基于 Java 的实用程序,它将某些列值从一个表迁移到另一个表。我的第一个表包含一个 ID 列,其值是固定类型的(例如,之前在第一个表中插入的 Java 中的某些枚举类型)

以下是我正在遵循的总结步骤:

  1. 获取新的数据库连接并将自动提交设置为 false。
  2. 从第一个表中选择唯一类型的 id。
  3. 为每个唯一的u id 创建一个线程池。在提交迁移作业时,我将相同的数据库连接传递给之前获得的每个线程。
  4. 每个线程都将值从第一个表迁移到第二个表,最后每个线程都执行数据库提交。
  5. 此时我的主线程正在等待 future.get()。
  6. 所有线程完成后,我将在主线程中删除第一个表(并进行显式提交)并关闭连接。

该实用程序支持 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. 在这里,在我的主线程中,我首先删除表,然后关闭连接,从而以顺序方式执行这些操作。那为什么我会收到上述异常呢?我做错了什么?

  2. 当我将自动提交设置为 false 时,是否需要对 DROP 进行显式提交?

java jdbc db2
1个回答
0
投票

在Db2中,在关闭数据库连接之前需要使用COMMIT或ROLLBACK提交事务。仅当您对数据库数据进行更改(例如INSERT和DELETE)时,才会执行COMMIT和ROLLBACK,并且COMMIT和ROLLBACK用于仅引用数据的SELECT。我确信有很多人不注意-,但至少在 Db2 中,即使在 SELECT` 的情况下,你也需要了解事务。

在上面的源代码中,自动提交被关闭(con.setAutoCommit(false))。如果auto-commit = true,jdbc驱动程序会在调用Connection::close时自动提交,但如果auto-commit = false,程序员会显式地Connection::commit或。如果不调用Connection::rollback,事务将不会被提交。换句话说,在上面的源代码中,我们关闭了自动提交,因此我们尝试在未确认事务的情况下关闭连接,导致“ERRORCODE = -4471”。

© www.soinside.com 2019 - 2024. All rights reserved.