- - PR -
Torqueのトランザクション処理後について
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 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()すらなかったので、自分で付け足した)では問題があるのでしょうか? 質問は以上ですが、よろしくお願いいたします。 |
|
投稿日時: 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-11-06 14:23
こんにちわ。さやべえです。
Torque.properties内でのpoolの設定はどうされていますか? 私の経験で、サイトが本番運用され、アクセス数が高くなったら とたんにコネクションが開放されずに足りなくなる現象に陥った ことがあります。 Google等で検索したところ、初期設定のold poolではなくJdbc2Poolを 使ったほうがよいという記事を見つけ、変更したところこのようなことが なくなりました。 ちなみにDBはPostgreSQLでした。 的外れでしたらすいません。 [ メッセージ編集済み 編集者: さやべえ 編集日時 2003-11-06 14:30 ] |
|
投稿日時: 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 ] |
|
投稿日時: 2003-11-06 14:48
さやべえさん、POTETOさん、ご回答ありがとうございます。
Torque.propertiesは、ほぼディフォルトの記述です。 なので、Using torque's old poolとかかれている部分をカスタマイズしている形です。 じぶんも、さやべえさんの言われた記事を検索していたときに見つけました。 ただ、単純に書き換えても、今開発を行っているTorqueのinit処理で落ちるので まずはcommit辺りが問題かなあ?と思った次第です。 でも、その記事以外の方でも変更を行った方が不具合を起こさないように なっているようなので、早速変更してみたいと思います。 POTETOさんのレスも、かなり勉強になります。いつもありがとうございます。 前の担当の方が、Torqueのinit処理とdestroy処理を作成されていて、同様に そこにのみshutdowmメソッドがありました。 ただ、何らかの不具合で落ちるときがあるといけないので、どこかで明示的に呼んでやる必要があるのかも?と思ったりしました。 ということで、早速init処理の変更を行い、Jdbc2Pool側の設定で対処してみたいと思います。 |
|
投稿日時: 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は変更していません。 何が原因なのでしょうか? よろしくご教授お願いいたします。 |
|
投稿日時: 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 22:07
接続確認しないのであれば
torque.dsfactory.xxxx.pool.testOnBorrow=false でよいと思いますが、通常はオラクルであれば、 torque.dsfactory.xxxx.pool.validationQuery=SELECT 1 FROM DUAL になると思います。 |
