Я работаю над утилитой на основе Java, которая переносит некоторые значения столбцов из одной таблицы в другую. Моя первая таблица содержит столбец идентификаторов, значения которого имеют фиксированный тип (например, некоторые типы перечислений в Java, которые были вставлены ранее в первую таблицу).
Ниже приведены общие шаги, которые я выполняю:
Получение нового соединения с базой данных и установка autocommit как false.
Выбор уникального типа идентификаторов из первой таблицы.
Создание пула потоков для каждого уникального идентификатора. Отправляя задание миграции, я передаю одно и то же соединение с базой данных каждому потоку, полученному ранее.
Каждый поток переносит значения из первой таблицы во вторую таблицу, и в конце каждый выполняет фиксацию базы данных.
До этого времени мой основной поток ожидает Future.get().
Как только все потоки завершатся, в основном потоке я удаляю первую таблицу (и делаю явную фиксацию) и закрываю соединение.
Эта утилита поддерживается для баз данных 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
Здесь, в моем основном потоке, я сначала удаляю таблицу, а затем закрываю соединение, делая это последовательно. Тогда почему я получаю вышеуказанное исключение? Что я делаю неправильно?
Нужно ли делать явную фиксацию для DROP, поскольку я устанавливаю для autocommit значение false?
Я работаю над утилитой на основе Java, которая переносит некоторые значения столбцов из одной таблицы в другую. Моя первая таблица содержит столбец идентификаторов, значения которого имеют фиксированный тип (например, некоторые типы перечислений в Java, которые были вставлены ранее в первую таблицу).
Ниже приведены общие шаги, которые я выполняю:
[list] [*]Получение нового соединения с базой данных и установка autocommit как false. [*]Выбор уникального типа идентификаторов из первой таблицы. [*]Создание пула потоков для каждого уникального идентификатора. Отправляя задание миграции, я передаю одно и то же соединение с базой данных каждому потоку, полученному ранее. [*]Каждый поток переносит значения из первой таблицы во вторую таблицу, и в конце каждый выполняет фиксацию базы данных. [*]До этого времени мой основной поток ожидает Future.get(). [*]Как только все потоки завершатся, в основном потоке я удаляю первую таблицу (и делаю явную фиксацию) и закрываю соединение. [/list]
Эта утилита поддерживается для баз данных Oracle, UDB и ZOS и отлично работает для Oracle и UDB. Однако для баз данных ZOS при закрытии соединения с базой данных я получаю следующее исключение:
[code]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 [/code]
[list] [*]Здесь, в моем основном потоке, я сначала удаляю таблицу, а затем закрываю соединение, делая это последовательно. Тогда почему я получаю вышеуказанное исключение? Что я делаю неправильно? [*]Нужно ли делать явную фиксацию для DROP, поскольку я устанавливаю для autocommit значение false? [/list]