0

現在、トランザクション管理のために私がやっていることは次のとおりです。

Connection connection = getConnection();
connection.setAutoCommit(false);
updateTableX ( connection, ... );
updateTableY ( connection, ... );
connection.commit();
closeConnection();

「updateTableX」メソッドで接続を閉じることを回避できるかどうかを知りたいです。誰かが誤って接続を閉じた場合、私の updateTableY は接続されず、例外がスローされるためです。

4

4 に答える 4

4

ただ規律。一般に、既存のオブジェクトをラップするために新しいオブジェクトを作成する状況を除いて、メソッドはパラメーターとして渡されたものを閉じる責任を負うべきではありません。

接続を閉じないようにする方法は、コードupdateTableXに呼び出しを入れないようにすることですclose()。これは、実際には他のバグと何ら変わりはありません。updateTableX別のテーブルを恣意的に更新したり、例外をスローしたり、意図されていないことをしたりするのをどのように停止しますか? コードレビュー、単体テスト、統合テスト、手動テストなど...

別の接続をラップし、例外を介してすべてのメソッドをプロキシする実装を作成できることを意味しますが、それは時間の無駄のように思えます-関係する開発者が接続を閉じないことを信頼していない場合、残りを取得することを信頼しますか?コードの右?Connection close()

于 2009-07-01T06:08:51.840 に答える
2

Jonが言ったように、本当に呼び出しを禁止したい場合はclose()、「実際の」Connectionオブジェクトに転送するデコレータの実装を書くことができます。Connectionインターフェイスが大きすぎるため、コード例は投稿しません。ただし、最新の IDE では、コードを生成することは問題ありません。

レシピ(Eclipseを使用していると仮定):

  1. を実装するクラスを作成しますConnectionが、メソッドは実装しません
  2. フィールドを作成するprivate Connection delegate;
  3. フィールド名を選択->ソース(メニュー)->「フィールドを使用してコンストラクターを生成」->フィールドが選択されていることを確認し、[OK]を押します
  4. フィールド名を選択->ソース(メニュー)->「デリゲートメソッドの生成...」->フィールドのすべてのメソッドをチェック
  5. close()メソッドの実装を変更して、UnsupportedOperationException

しかし、ジョンが言ったように、私はそのようなことをすることを本当に考えます. また、Object-Relational-Mapper (例: Hiberate ) を使用して、すべてのデータベース アクセス ロジックをカプセル化することもできます。この分野で非常に役立つ追加のフレームワークはSpringです。ConnectionDataSource

于 2009-07-01T06:22:05.953 に答える
0

(私は特にJavaに慣れていません)

ある種のデータベース管理オブジェクトがあると仮定すると、操作を試みる前にそれが接続されていることを確認することができます。

接続を閉じるアクセスを制限しようとすることはできますが、接続を閉じる必要があるかどうか、または「偶発的」であるかどうかをどのように判断しますか (ただし、それを定義します)。

于 2009-07-01T06:08:03.837 に答える
0

あなたが求めていることは不可能だと思います。

技術的には接続オブジェクトのコピーを作成できますが、クライアント プログラマーが接続を閉じないとどうなるでしょうか?

于 2009-07-01T06:09:31.637 に答える