<div dir="ltr"><div><div style="font-family:arial,sans-serif;font-size:14px">初めまして、千葉と申します。<br></div><div style="font-family:arial,sans-serif;font-size:14px">私は、S2JDBCを使用したシステムの保守を行っています。</div><div style="font-family:arial,sans-serif;font-size:14px">
<br></div><div style="font-family:arial,sans-serif;font-size:14px">保守で発生したトラブルの対応について検討中なのですが、</div><div style="font-family:arial,sans-serif;font-size:14px">S2JDBCにつきまして不明な点があるため、質問させて頂きます。</div><div style="font-family:arial,sans-serif;font-size:14px">
<br></div><div style="font-family:arial,sans-serif;font-size:14px">お忙しい中、大変申し訳ありませんが、ご教授の程、宜しくお願い致します。</div><div style="font-family:arial,sans-serif;font-size:14px"><br></div><div style="font-family:arial,sans-serif;font-size:14px">
質問内容、発生事象の詳細は以下の通りです。</div></div><div style="font-family:arial,sans-serif;font-size:14px"><span style="font-family:arial;font-size:small">【質問】</span><br></div><div> ①S2JDBCの設定変更でコネクション取得順を制御可能か?</div><div> トランザクション開始順とコネクション取得順が同一となるように制御する事は可能でしょうか?</div>
<div><br></div><div> やりたいのは、「maxPoolSize」を超えるコネクション取得時、</div><div> トランザクションが開始された順に解放されたコネクションを割り当てると言う事です。</div><div><br></div><div> ②①が可能であれば、設定方法についてご教授下さい。</div><div> URLを参考にさせて頂き、「maxWait」の設定が有効であると考えましたが、</div><div>
これは、コネクション枯渇した場合に待つ設定のため、順番を担保するという設定とは異なると考えました。</div><div><br></div><div> <確認したURL></div><div> <a href="http://s2container.seasar.org/2.4/ja/jdbc.html">http://s2container.seasar.org/2.4/ja/jdbc.html</a></div><div>
<br></div><div>【事象】</div><div> 以下の流れで、DB更新の逆転が発生しました。</div><div> 1.同一クライアントからA、Bの順にデータを受信</div><div> 2.トランザクションA、Bの順に開始</div><div> 3.負荷により一時的に「maxPoolSize」を超えるコネクション接続が発生、トランザクションAがコネクション取得待ち状態へ遷移</div><div> 4.コネクション解放されたタイミングでトランザクションBがコネクションを取得、トランザクションAより前にDB更新を実施</div>
<div> 5.トランザクションAがコネクションを取得し、DB更新を実施</div><div> </div><div> 本事象は、トランザクション開始した順にコネクション取得順を制御できれば、</div><div> 回避出来る問題と考えております。</div><div><br></div><div> <DB更新時のログ内容></div><div> DB更新時のログ出力内容です。④~⑦でデータBが先にコネクション取得し、DB更新が先に処理されました。</div>
<div> ①Javaアプリから更新依頼(データA)</div><div> ②Javaアプリから更新依頼(データB)<br></div><div> ③DEBUG TransactionImpl - トランザクションを開始しました。(データA)</div><div> ④DEBUG TransactionImpl - トランザクションを開始しました。(データB)</div><div><br></div><div> ⑤DEBUG ConnectionPoolImpl - 論理的なコネクションを取得しました。(データB)</div>
<div> ⑥DEBUG AutoInsertImpl - DB更新(データB)</div><div> ⑦DEBUG TransactionImpl - トランザクションをコミットしました。(データB)</div><div> ⑧DEBUG ConnectionWrapperImpl - 論理的なコネクションを閉じました。(データB)</div><div><br></div><div> ⑨DEBUG ConnectionPoolImpl - 論理的なコネクションを取得しました。(データA)</div>
<div> ⑩DEBUG AutoInsertImpl DB更新(データA)</div><div> ⑪DEBUG TransactionImpl - トランザクションをコミットしました。(データA)</div><div> ⑫DEBUG ConnectionWrapperImpl - 論理的なコネクションを閉じました。(データA)</div><div><br></div><div>【環境】</div><div> Javaアプリケーションサーバを構築、</div>
<div> S2JDBCを使用し、DB更新処理を実装しております。</div><div><br></div><div> <OS></div><div> Linux Red Hat Enterprise Linux 5.5(カーネルバージョン:2.6.18-194.el5PAE)</div><div><br></div><div> <アプリケーション構成></div><div> ・Java 1.5</div><div>
・PostgreSQL 8.4</div><div> ・S2JDBC</div><div><br></div><div> <jdbc.dicon設定></div><div> ・maxPoolSize 10</div><div> ・maxWait 定義なし</div><div><br></div><div>情報が不足しているようなら、ご指摘ください。</div><div><br></div><div>また、既出の問題でございましたら大変申し訳ありません。</div>
<div><br></div><div>ご確認よろしくお願い致します。</div><div><br></div><div>以上です。</div><div><br></div></div>