Можно ли закрыть транзакции в транзакции, прежде чем совершать ее в Derby (JDBC)?

В основном у меня (игнорирование обработки исключений и т.д.):

connection.setAutoCommit(false);

Statement statement1 = connection.createStatement();
statement1.executeUpdate("...");
statement1.close();

Statement statement2 = connection.createStatement();
statement2.executeUpdate("...");
statement2.close();

connection.commit();

Если я правильно понимаю, он не должен иметь никакого влияния, потому что все, что он действительно делает, - это свободные ресурсы для GC. Специально с Derby: вы должны явно закрыть Statement, ResultSets и Connections, когда они вам больше не нужны. Соединения с Derby - это ресурсы, внешние для приложения, и сборщик мусора не будет закрывать их автоматически.

Однако будут ли возникать проблемы с транзакцией? Я не считаю, что сделка зависит от Заявления. Кто-нибудь может подтвердить это?

Ответы

Ответ 1

Абсолютно, вы можете закрыть их, и вы должны.

Ответ 2

Вообще говоря, как только a Statement выполняется, базовый источник данных/база данных отвечает за успешное выполнение. Ожидается, что любые сбои приведут к тому, что SQLException будет выведено в вызовы Statement.executeXXX. И любое успешное выполнение приведет к тому, что база данных будет отслеживать эти обновления во временной рабочей области. Выполнение транзакции просто гарантирует, что обновления, вызванные операциями, записываются в надежный магазин из временной рабочей области. Это часто происходит в большинстве/всех базах данных.

Поэтому безопасно закрыть объект Statement, если он вам больше не нужен, без каких-либо побочных эффектов в транзакции.

Ответ 3

Угу. Это хорошая практика и подход к закрытию заявления перед совершением транзакций.