Проблема в том, что вы выполняете два оператора для соединения, которое находится в режиме автоматической фиксации. В режиме автоматической фиксации при выполнении оператора наборы результатов, созданные другими операторами, закрываются.
Как описано в спецификации JDB C 4.3 , в разделе 15.2.5 Закрытие ResultSet
объекта :
A ResultSet
объект неявно закрывается, когда
- Повторно выполненный связанный
Statement
объект ResultSet
создается с Удерживаемостью CLOSE_CURSORS_AT_COMMIT
и происходит неявное или явное принятие
С Jaybird (драйвер Firebird JDB C) вы есть три варианта:
Отключить автоматическую фиксацию перед выполнением операторов:
conn.setAutoCommit(false);
Сделать первый оператор доступным для фиксации, выполнив as
Statement stmt = conn.createStatement(
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY,
ResultSet.HOLD_CURSORS_OVER_COMMIT);
Это приведет к тому, что полученный результат останется открытым после фиксации (automati c). Имейте в виду, однако, что в этом режиме Jaybird будет извлекать весь набор результатов в память, а не извлекать его партиями.
- Как и в предыдущем варианте, вы можете настроить Jaybird по умолчанию на использование holdable наборы результатов, указав свойство соединения
defaultResultSetHoldable
set. См. Также Наборы удерживаемых результатов по умолчанию . Установка этого свойства повлияет на все операторы и результирующие наборы.
Первый вариант предпочтительнее.
Кроме того, я настоятельно рекомендую вам начать использовать try-with-resources : ваш текущий код уязвим для утечек ресурсов.
Как указано в комментариях Kayaman, вам следует подумать о переписывании ваших запросов, чтобы это был всего лишь один запрос. В настоящее время вы создаете так называемую проблему запроса N + 1 (выполнение оператора, а затем для каждой строки этого оператора выполнение другого оператора). Использование соединения в вашем запросе позволит вам выполнить его как один запрос. И как предупреждение, ваш запрос уязвим для сохраненной SQL инъекции, потому что вы объединяете значение в строку запроса.