[Seasar-user:19038] DBコネクション枯渇時にコネクション取得がブロックされ続ける現象について

阿部 裕康 [E-MAIL ADDRESS DELETED]
2009年 12月 17日 (木) 17:29:28 JST


お世話になります。阿部と申します。

Seasar2とTOMCATを組み合わせて使用しているのですが、
DBコネクションを使い切った場合にTOMCATが応答しなくなる現象が
発生しています。

  発生するバージョン:
    Tomcat 5.5.27
    s2-framework-2.4.34.jar
    s2-dao-1.0.50.jar

jdbc.diconでTOMCATのデータソースを使用する設定をしています。
------------------------------------------------
	<component name="xaDataSource"
		class="org.seasar.extension.dbcp.impl.DataSourceXADataSource" autoBinding="none">
		<property name="dataSourceName">"java:comp/env/jdbc/xxx"</property>
	</component>

	<component name="connectionPool"
		class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
		<property name="timeout">600</property>
		<property name="maxPoolSize">0</property>
		<property name="allowLocalTx">true</property>
		<destroyMethod name="close"/>
	</component>

	<component name="dataSource"
		class="org.seasar.extension.dbcp.impl.DataSourceImpl"
	/>
------------------------------------------------


動作を調べたところ、
コネクションが枯渇している状態で新規コネクションを取得しようとすると、
S2DBCPのConnectionPoolImpl.checkout()の中でcreateConnection()を経由し
tomcat.DBCPのPoolingDataSource.getConnection()を呼び出し
コネクションの空き待ちを行います。

この状態で、既にトランザクションを開始しているスレッドが
コネクションを取得しようとすると、checkout()がsynchronizedなため
ブロックされることになります。

結果、コネクションの空き待ちをしているスレッドがタイムアウトエラーに
ならない限りブロックされ続けるので、アプリケーションが無応答になるようです。


当方でのコード修正も検討したのですが、良い修正方法が見つかりませんでした。

本現象を回避する方法などあればご教示いただけませんでしょうか?

よろしくお願いします。

━━━━━━━━━━━━━━━━━
 キヤノンソフトウェア株式会社
  商品企画本部 商品開発一部
    商品開発1課) 阿部 裕康
 <[E-MAIL ADDRESS DELETED]>
━━━━━━━━━━━━━━━━━



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