[Seasar-user:9271] Re: 高負荷時のDBアクセスについて

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2007年 7月 20日 (金) 06:30:02 JST


小林 (koichik) です.

Date:    Fri, 20 Jul 2007 03:27:22 +0900
From:    "Umebayashi Tsuyoshi" <[E-MAIL ADDRESS DELETED]>
To:      <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:9269] 高負荷時のDBアクセスについて

> 高負荷(大量アクセス)時にDBへアクセスが行えないという現象が発生し
> 調査をおこなっていたところ、frameworkが書き出しているログを
> 見るとコネクションプールの取得を行い
> SQLを投げる手前で処理が止まっているように見受けられます。

とのことですが,

> 【正常な時】
> 1.論理的なコネクションを取得しました
> 2.論理的なコネクションを閉じました
> 3.SQL文

このログの出方ですが,SQL がコネクションを
閉じた後に発行されるはずがないので,実際は

【正常な時】
1.論理的なコネクションを取得しました
2.(SQL 実行)
3.論理的なコネクションを閉じました
4.SQL文 ログ出力

となっているはずで,とすると,

> 【異常な時】
> 1.論理的なコネクションを取得しました
> 
> ↑ ここで止まる

も実際は

【異常な時】
1.論理的なコネクションを取得しました
2.(SQL 実行)
↑ ここで止まる

となっているのではないかと.
まずは DB サーバ側の CPU 利用率とか確認してみては
いかがでしょうか.
もし DB サーバの能力以上に多くのトランザクションが
実行されているなら,コネクションプールの接続数の上限を
DB サーバの能力に見合った値に設定してください.

> また、SQLの応答が得られなかった時はタイムアウトさせたいとのですが
> そのようなことは可能なのでしょうか?

Seasar2.3.21 以降または Seasar2.4.14 以降であれば,
ConfigurableStatementFactory を使うことで
タイムアウト時間を設定することができます.
Seasar2.3 なら j2ee.dicon,Seasar2.4 なら jdbc.dicon に

<component class="org.seasar.extension.jdbc.impl.ConfigurableStatementFactory">
  <arg>
    <component class="org.seasar.dao.pager.PagerStatementFactory"/>
  </arg>
  <property name="queryTimeout">60</property>
</component>

のように秒単位で指定できるようです.
自分は試したことがないので JDBC ドライバがどの程度
ちゃんと機能するのか知りませんが.
# 昔々,Oracle では設定した時間より遥かに長い時間
# タイムアウトしないという話を聞いた気がしますが,
# これも最近のドライバでは大丈夫だったりするのかなぁ?


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>




Seasar-user メーリングリストの案内