2011-11-24 5 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

ステートメントを閉じると、_transaction_はDB側でまだ開いているようです(コミットまたはロールバックを待っています)。接続にコミットまたはロールバック・コマンドが出されたときにのみ終了/クローズされます。私は正しい? – ADTC

答えて

15

絶対に閉じてください。

+2

+1の "should" –

+0

私は同意します。しかし、トランザクションが終了する前か、トランザクションが完了した後でなければならないことはありますか? –

6

一般に、Statementが実行されると、基礎となるデータソース/データベースが正常に実行されることを保証します。どんな失敗も、呼び出しではSQLExceptionがスローされることが予想されます。そして、実行が成功すると、データベースは一時的な作業領域でこれらの更新を追跡します。トランザクションをコミットすると、ステートメントによって引き起こされた更新が、一時的な作業領域から永続ストアに書き込まれることが保証されます。これはほとんどの/すべてのデータベースでよく見られます。

したがって、不要になったらStatementオブジェクトを閉じても、トランザクションに何らかの副作用が発生することはありません。

0

もちろん、トランザクションをコミットする前に文を閉じることは安全です。 coderanchのClosing Statement object prior to committingとJDBCトランザクションtutorialを読んでください。

+2

私は、両方の事実をしました。 Java Ranchのコメントは、「私が信じている」と始まります。これは確認ではなく、誰もそれを助長しませんでした。議論は正反対になりました。 JDBCチュートリアルでは、コミット後のfinallyブロックのStatementsを閉じます。かつてStatementを閉じると何が起こるかは言及されていません。だからあなたのコメントに注意してください、それは明らかではないし、それらの参照のいずれかに記載されていません... –

1

トランザクションをコミットする前にトランザクションをクローズするのがよい方法とアプローチです。

関連する問題