2

Java アプリケーションで spring + hibernate + tomcat jdbc を使用しています。たとえば、データベースのクラッシュが発生したときに、接続の問題を処理できるようにしたいと考えています。私が得た問題は、jdbc 接続を取得しようとすると休止状態がブロックされ (たとえば、mysql がダウンしている場合)、タイムアウトせずに http 要求が無期限にハングすることです。

ここに私の休止状態の設定があります:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource">
    <ref bean="dataSource"/>
  </property>
  <property name="hibernateProperties">
       <props>
         <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
         <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
         <prop key="hibernate.connection.release_mode">auto</prop>
     </props>
  </property>
  <property name="mappingResources">
    <list>
      <value>detection/model/conf/rules.hbm.xml</value>
</list>
  </property>
</bean>

そして私のjdbcデータソース設定:

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">

    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="initialSize" value="10" />
    <property name="maxActive" value="100" />
    <property name="maxIdle" value="50" />
    <property name="minIdle" value="10" />
    <property name="testOnBorrow" value="true"/>
    <property name="testOnReturn" value="true"/>
    <property name="testWhileIdle" value="true"/>
    <property name="maxWait" value="2000"/>
    <property name="validationQuery" value="/*ping*/ SELECT 1"/>
    <property name="timeBetweenEvictionRunsMillis" value="2000"/>
    <property name="removeAbandonedTimeout" value="2000"/>
    <property name="removeAbandoned" value="true"/>
    <property name="validationInterval" value="5000"/>

 </bean>

特定の時間後に接続を待機してタイムアウトするように休止状態に指示する方法はありますか?

アップデート :

c3p0 に切り替えましたが、同じ動作になりましたが、c3p0 でより多くのデバッグ情報が得られました。例外がスローされたことがわかりますが、c3p0 はそれをキャッチして何もしないように見えるため、mysql サーバーを再起動するまで http 要求はハングしたままです。

DEBUG 2012-12-07 09:07:46,994 : Opening Hibernate Session
DEBUG 2012-12-07 09:07:46,994 : opened session at timestamp: 13548892669
DEBUG 2012-12-07 09:07:46,994 : about to open PreparedStatement (open         PreparedStatements: 0, globally: 2)
DEBUG 2012-12-07 09:07:46,994 : opening JDBC connection
DEBUG 2012-12-07 09:07:46,994 : trace com.mchange.v2.resourcepool.BasicResourcePool@195b6aad [managed: 10, unused: 7, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@6b0ede6)
DEBUG 2012-12-07 09:07:46,994 : select rules0_.product as product2_, rules0_.rules as   rules2_, rules0_.type as type2_ from rules rules0_ where rules0_.product=? and rules0_.type=?
DEBUG 2012-12-07 09:07:46,995 : com.mchange.v2.c3p0.impl.NewPooledConnection@60487c5f handling a throwable.
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
4

2 に答える 2

1

最後に、c3p0 で必要な動作が得られました。私が使用した設定は次のとおりです。

    <property name="acquireRetryDelay" value="5000"/>
    <property name="breakAfterAcquireFailure" value="true"/>
    <property name="checkoutTimeout" value="1"/>
    <property name="testConnectionOnCheckin" value="1" />

データベースがシャットダウンしたときに接続を閉じずに無期限にハングアップしないidleCheckテストとは対照的に、プールから壊れた接続を正しく削除するキープロパティはbreakAfterAcquireFailureだったと思います。これにより、プールが正しく管理されるため、checkoutTimeout が適切に機能します。また、接続プロバイダーは、データベースが復旧したときに正しく再接続します。

于 2012-12-07T16:29:09.340 に答える
0

このSO 投稿では、接続を取得できない場合に例外をスローするように C3PO を構成する方法について説明します。

于 2012-12-07T15:13:03.867 に答える