2011-11-24 53 views
14

基本上我有(忽略异常处理等):在Derby(JDBC)中提交事务之前,我可以关闭事务中的语句吗?

connection.setAutoCommit(false); 

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

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

connection.commit(); 

如果我理解正确的话应该不会有任何影响,因为它所做的事情是免费为GC的资源。 Especially with Derby:当不再需要时,您应该显式关闭语句,结果集和连接。与Derby的连接是应用程序外部的资源,垃圾收集器不会自动关闭它们。

但它会导致交易的任何问题?我不相信交易依赖于该声明。任何人都可以请确认吗?

+0

看来,如果关闭一个Statement,_transaction_仍然在数据库端打开(等待提交或回滚)。只有在向连接发出提交或回滚命令时才结束/关闭。我对吗? – ADTC

回答

15

当然,你可以关闭他们,你应该。

+2

+1为“应该” –

+0

我同意。但是,在交易终止之前还是必须在交易完成之后呢? –

6

一般而言,一旦执行Statement,底层数据源/数据库负责确保成功执行。预计任何故障都会导致Statement.executeXXX调用中出现SQLException。任何成功的执行都会导致数据库在临时工作区中跟踪这些更新。提交事务只能确保由语句引起的更新从临时工作区写入耐用存储区。大多数/所有数据库都是这种情况。

因此,一旦您不再需要它就可以安全地关闭Statement对象,而不会在事务中遇到任何副作用。

0

当然,在提交事务之前关闭语句是安全的。您应该阅读来自coderanch和JDBC事务处tutorialClosing Statement object prior to committing

+2

我做到了,两者其实都是。 Java牧场评论从“我相信”开始,这不是确认,也没有人推动它,讨论正好相反。在提交之后,JDBC教程关闭finally块中的语句。而且,如果您之前关闭了声明,则没有提及会发生什么情况。所以请注意你的评论,这不是很明显,也没有在任何一篇参考文献中说明...... –

1

是的。在进行交易之前,它是一种很好的做法和方法来完成声明。

相关问题