【问题标题】:Hibernate JDBC connection blockingHibernate JDBC 连接阻塞
【发布时间】:2012-12-06 20:47:54
【问题描述】:

我在我的 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 似乎捕获了它并且什么也不做,所以 http 请求仍然挂起,直到我重新启动 mysql 服务器。

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

【问题讨论】:

  • 尝试切换到C3P0连接池看看问题是否依然存在。我记得在数据库关闭或 Tomcat 的连接池连接丢失的情况下会遇到很多问题。当数据库再次启动而 Tomcat 的池不再启动时,C3P0 正在正确重新连接。
  • 您可能想尝试BoneCP 作为替代方案。
  • 挂在哪里?使用 jstack 进行线程转储并找出答案。根据是等待从池中获取连接还是一旦获得连接等待某些操作完成,解决方案会有所不同。
  • 使用tomcat-jdbc你可以在这里找到所有要设置的属性tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html#Attributes

标签: spring hibernate jdbc


【解决方案1】:

终于得到了我想要的 c3p0 行为。这是我使用的配置:

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

我认为关键属性是 breakAfterAcquireFailure ,它将正确地从池中删除断开的连接,而 idleCheck 测试在数据库关闭时不会关闭连接并无限期挂起。这使得 checkoutTimeout 正常工作,因为池得到了正确管理。恢复数据库后,连接提供程序也会正确重新连接。

【讨论】:

    【解决方案2】:

    SO Post 描述了如何配置 C3PO 在无法获取连接时抛出异常。

    【讨论】:

    • 我在 c3p0 上遇到的当前问题不是无法获取连接,而是之前获取的连接中断。我在 5 秒时设置了一个 idleConnectionTestPeriod,但是当连接中断时,空闲测试只是无限期挂起,并且 http 请求创建了一个带有一堆的 stackoverflow:DEBUG 2012-12-07 10:26:47,414:我们要检查的资源是在空闲检查! (等待空闲检查完成。)[com.mchange.v2.resourcepool.BasicResourcePool@6b033450]
    猜你喜欢
    • 1970-01-01
    • 2017-04-18
    • 2022-08-09
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    相关资源
    最近更新 更多