Ответ 1
Абсолютно, вы можете закрыть их, и вы должны.
В основном у меня (игнорирование обработки исключений и т.д.):
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 - это ресурсы, внешние для приложения, и сборщик мусора не будет закрывать их автоматически.
Однако будут ли возникать проблемы с транзакцией? Я не считаю, что сделка зависит от Заявления. Кто-нибудь может подтвердить это?
Абсолютно, вы можете закрыть их, и вы должны.
Вообще говоря, как только a Statement
выполняется, базовый источник данных/база данных отвечает за успешное выполнение. Ожидается, что любые сбои приведут к тому, что SQLException
будет выведено в вызовы Statement.executeXXX
. И любое успешное выполнение приведет к тому, что база данных будет отслеживать эти обновления во временной рабочей области. Выполнение транзакции просто гарантирует, что обновления, вызванные операциями, записываются в надежный магазин из временной рабочей области. Это часто происходит в большинстве/всех базах данных.
Поэтому безопасно закрыть объект Statement
, если он вам больше не нужен, без каких-либо побочных эффектов в транзакции.
Угу. Это хорошая практика и подход к закрытию заявления перед совершением транзакций.
Конечно, можно закрыть заявления до совершения транзакций. Вам нужно прочитать - объект закрывающего заявления до совершения из coderanch и транзакций JDBC tutorial.