- PR -

ResultSet/Statementのクローズについて。

投稿者投稿内容
kito
ベテラン
会議室デビュー日: 2003/03/24
投稿数: 59
お住まい・勤務地: Osaka
投稿日時: 2005-02-04 19:21
引用:

Sampleさんの書き込み (2005-02-04 18:48) より:
セションにコネクションを保持しており、


セッションにコネクションを保持してはいけません。
セッションの数だけ、使われない無駄なConnectionが開きっぱなしになってしまいます。


引用:

>Connectionの使いまわしとかしていませんかね。
セションにConnectionのオブジェクトを保持している状態なので、使いまわしています。
すみません、使いまわすことの危険性が分からないのですが・・・


絶対にConnection変数/オブジェクトを使いまわしてはいけません。
複数スレッドから非同期に操作されて、ストレージとしてのDBの意味が全くなくなります。

例えば、一つのConnectionに対して
(スレッド1): executeUpdate("insert into tableA values (***)");
(スレッド2): conn.rollback();
(スレッド1): conn.commit();

の順に実行された場合、
スレッド1ではtableAに行を追加したつもりなのに実際は何も追加されないことになります。
こんなプログラム信用できますか?

引用:

>このrsをどこで宣言して、どう使っていますか?
>おそらく変数rs及びResultSetオブジェクトの誤った共有を行っていると考えられます。
>close()されないままのResultSetオブジェクトの残骸がたくさん残っていることでしょう。
グローバル変数で宣言し、nullをセットしています。



絶対にグローバル変数にしてはいけません。Connectionと全く同じ理由です。
必ずローカル変数にする必要があります。

(スレッド1): rs = executeQuery("select * from tableA");
(スレッド2): rs = executeQuery("select * from tableB");
スレッド1の次のコードはどうなりますか?


引用:

ローカル変数で宣言するべきでしょうか。。。


Connection,PreparedStatement,ResultSetはすべてローカル変数にしましょう。絶対です。
共有していいのは唯一javax.sql.DataSourceオブジェクトだけです。


[ メッセージ編集済み 編集者: kito 編集日時 2005-02-04 19:23 ]

スキルアップ/キャリアアップ(JOB@IT)