- PR -

Torqueのトランザクション処理後について

投稿者投稿内容
C'zka
ベテラン
会議室デビュー日: 2003/09/04
投稿数: 64
投稿日時: 2003-11-06 14:00
いつもお世話になっています。
現在、本番環境で動作しているアプリケーションでコネクションプールがたまっている
現象があるらしく、それについて質問させてください。

いろいろと検索してみて、自分なりに原因になるだろう場所がどこか確認したところ、
トランザクション処理が入っているところではないかと思いました。
下記がそのソースの抜粋です。

Connection conn = null;
try {
conn = Transaction.begin(LogintblPeer.DATABASE_NAME);
Criteria crit = new Criteria();
       〜登録等の処理〜
conn.commit();
 conn.close();
} catch (TorqueException te) {
// ロールバック
if (conn != null) {
try {
Transaction.rollback(conn);
} catch (TorqueException ex) {

}
}
   conn.close();
} catch (Exception e) {
   conn.close();
}

いろいろなサイトを見ていると、接続時に
Torque.getConnection(DB名);
閉じるときに
Torque.closeConnection(conn);
Torque.shutdown();
と記載されています。

自分が書いてきた形(もともと他の人が作られていたソースにはconn.close()すらなかったので、自分で付け足した)では問題があるのでしょうか?

質問は以上ですが、よろしくお願いいたします。
C'zka
ベテラン
会議室デビュー日: 2003/09/04
投稿数: 64
投稿日時: 2003-11-06 14:09
環境を書き忘れたので・・・・
本番環境
OS Linux(Miracle Linaxだと思われる)
DB Oracle9i
サーバ Oracle9iAS oj4c
Java フレームワーク struts1.1

テスト環境
OS Win2K
DB Oracle9i
サーバ Tomcat 4.1.24
Java フレームワーク struts1.1
さやべえ
常連さん
会議室デビュー日: 2003/03/13
投稿数: 33
投稿日時: 2003-11-06 14:23
こんにちわ。さやべえです。

Torque.properties内でのpoolの設定はどうされていますか?

私の経験で、サイトが本番運用され、アクセス数が高くなったら
とたんにコネクションが開放されずに足りなくなる現象に陥った
ことがあります。

Google等で検索したところ、初期設定のold poolではなくJdbc2Poolを
使ったほうがよいという記事を見つけ、変更したところこのようなことが
なくなりました。

ちなみにDBはPostgreSQLでした。

的外れでしたらすいません。

[ メッセージ編集済み 編集者: さやべえ 編集日時 2003-11-06 14:30 ]
POTETO
常連さん
会議室デビュー日: 2003/10/06
投稿数: 41
投稿日時: 2003-11-06 14:32
こんにちは、POTETOです。

Transaction.begin(DB名)は結局メソッド内で、Torque.getConnection()を
コールしています。

Torque.closeConnection(コネクション)ですが、これもメソッド内で
Connection.close()をコールしているだけです。SQLExceptionの時に
エラーログを出力している程度しか変わりはありません。
しかし、SQLExceptionをcatchしてthrowしていないので、
プログラム側にSQLExceptionがthrowされなくなります。

ちなみに、Transaction.rollback(コネクション)やTracsaction.commit(コネクション)
は、メソッドの最後に、Torque.closeConnection(コネクション)を実行しています。

Torque.shutdown()ですが、これはコンフィグレーションをリセットしたり、
IDBroker(よく調べてないのでこれがなんだかわかりません。)を停止る
処理が行われます。
私は、StrutsのPlugINクラスを作成しinit()メソッドでTorque.init()を
行っているので、shutdown()はdestroy()メソッド内にしか記述していません。
それでいいかはわかりませんが。。。

参考にならない回答だったらすいませんが以上です。
間違っている点があったら誰か指摘願います。


[ メッセージ編集済み 編集者: POTETO 編集日時 2003-11-06 14:43 ]

[ メッセージ編集済み 編集者: POTETO 編集日時 2003-11-06 14:45 ]
C'zka
ベテラン
会議室デビュー日: 2003/09/04
投稿数: 64
投稿日時: 2003-11-06 14:48
さやべえさん、POTETOさん、ご回答ありがとうございます。
Torque.propertiesは、ほぼディフォルトの記述です。
なので、Using torque's old poolとかかれている部分をカスタマイズしている形です。

じぶんも、さやべえさんの言われた記事を検索していたときに見つけました。
ただ、単純に書き換えても、今開発を行っているTorqueのinit処理で落ちるので
まずはcommit辺りが問題かなあ?と思った次第です。
でも、その記事以外の方でも変更を行った方が不具合を起こさないように
なっているようなので、早速変更してみたいと思います。

POTETOさんのレスも、かなり勉強になります。いつもありがとうございます。
前の担当の方が、Torqueのinit処理とdestroy処理を作成されていて、同様に
そこにのみshutdowmメソッドがありました。
ただ、何らかの不具合で落ちるときがあるといけないので、どこかで明示的に呼んでやる必要があるのかも?と思ったりしました。

ということで、早速init処理の変更を行い、Jdbc2Pool側の設定で対処してみたいと思います。
C'zka
ベテラン
会議室デビュー日: 2003/09/04
投稿数: 64
投稿日時: 2003-11-06 15:23
早速Torque.propertiesを修正し、Tomcatを再起動して動かしてみました。
が、sqlを発行するであろう処理の前で動かなくなり(ブラウザが接続中の状態)、
ログを見てみると、
IDBroker thread was started.
という記述のところで止まっていました。
init処理は正常終了し、Actionクラスのログも出ています。

Torque.propertiesの修正個所は、
1.Using torque's old poolに沿ったところを丸まるコメント
2.Using Jdbc2Poolに沿ったところを書き直した

torque.database.defaultは変更していません。

何が原因なのでしょうか? よろしくご教授お願いいたします。
C'zka
ベテラン
会議室デビュー日: 2003/09/04
投稿数: 64
投稿日時: 2003-11-06 15:33
変更箇所は下記のとおりです。まとめて投稿しなくてすいません・・・・・

torque.dsfactory.xxxx.factory=org.apache.torque.dsfactory.Jdbc2PoolDataSourceFactory
torque.dsfactory.xxxx.pool.defaultMaxActive=10
torque.dsfactory.xxxx.pool.testOnBorrow=true
torque.dsfactory.xxxx.pool.validationQuery=SELECT 1
torque.dsfactory.xxxx.connection.driver = oracle.jdbc.driver.OracleDriver
torque.dsfactory.xxxx.connection.url = jdbc:oracle:thin:@172.16.11.224:1521:el
torque.dsfactory.xxxx.connection.user = xxxx2
torque.dsfactory.xxxx.connection.password = xxxx2
銀太郎
会議室デビュー日: 2003/11/06
投稿数: 4
投稿日時: 2003-11-06 22:07
接続確認しないのであれば
torque.dsfactory.xxxx.pool.testOnBorrow=false
でよいと思いますが、通常はオラクルであれば、
torque.dsfactory.xxxx.pool.validationQuery=SELECT 1 FROM DUAL
になると思います。

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