【问题标题】:How to configure a connection pool with Hibernate?如何使用 Hibernate 配置连接池?
【发布时间】:2014-02-21 03:11:37
【问题描述】:

如何使用 Spring 和 Hibernate 配置连接池? 我的程序作为服务器来监听来自客户端的请求。 如果客户端每隔一小时发送一次请求,我的程序就会正常运行。 但是如果客户端在上午 00:00 到 07:00 之间没有发送请求,我的程序会捕获异常。

例外是:

org.hibernate.TransactionException:回滚失败 在 org.hibernate.engine.transaction.spi.AbstractTransactionImpl.rollback(AbstractTransactionImpl.java:215) 在 CardCharging_MemCache.dao.FilterDao.getConnectorId(FilterDao.java:123) 在 CardCharging_MemCache.bussiness.CDVFilterRequestProcess.PCSL(CDVFilterRequestProcess.java:29) 在 CardCharging_MemCache.myhttp.myHttphandle.handle(myHttphandle.java:113) 在 com.sun.net.httpserver.Filter$Chain.doFilter(未知来源) 在 sun.net.httpserver.AuthFilter.doFilter(未知来源) 在 com.sun.net.httpserver.Filter$Chain.doFilter(未知来源) 在 sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(未知来源) 在 com.sun.net.httpserver.Filter$Chain.doFilter(未知来源) 在 sun.net.httpserver.ServerImpl$Exchange.run(未知来源) 在 sun.net.httpserver.ServerImpl$DefaultExecutor.execute(未知来源) 在 sun.net.httpserver.ServerImpl$Dispatcher.handle(未知来源) 在 sun.net.httpserver.ServerImpl$Dispatcher.run(未知来源) 在 java.lang.Thread.run(未知来源) 原因:org.hibernate.TransactionException:无法针对 JDBC 连接回滚 在 org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doRollback(JdbcTransaction.java:167) 在 org.hibernate.engine.transaction.spi.AbstractTransactionImpl.rollback(AbstractTransactionImpl.java:209) ... 13 更多 引起:java.sql.SQLException:关闭连接 在 oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:3694) 在 org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doRollback(JdbcTransaction.java:163) ... 14 更多。

例外是关于连接。 任何人都可以帮助我。请。 谢谢!

【问题讨论】:

  • 使用 c3p0 api 进行连接池。并在休眠配置中设置池大小属性。
  • 显示发生异常的代码。

标签: java hibernate maven c3p0 dhcp


【解决方案1】:

如果连接空闲一段时间 [mysql 默认为 8 小时],正常 DB 连接无效,为避免这种情况,您只需在连接池中设置这些属性 - “validationQuery”、“validationInterval”、“testWhileIdle”、“ testOnBorrow”。他们将在空闲时间使用您的连接,并始终从池中返回有效连接。

【讨论】:

    【解决方案2】:

    尝试在您的连接池中使用此属性,它们应该避免会话失效

    <bean class="org.apache.tomcat.jdbc.pool.DataSource" id="dataSource" >
        <property name="driverClassName" value="${database.driverClassName}"/>
        <property name="url" value="${database.url}"/>
        <property name="username" value="${database.username}"/>
        <property name="password" value="${database.password}"/>
    
        <property name="minIdle" value="${database.minIdle}"/>
        <property name="initialSize" value="${database.initialPoolSize}"/>
        <property name="maxActive" value="${database.maxPoolSize}"/>
        <property name="maxIdle" value="${database.maxIdle}"/>
        <property name="testOnBorrow" value="true"/>
        <property name="validationQuery" value="SELECT 1"/>
    
        <property name="timeBetweenEvictionRunsMillis" value="30000"/>
        <property name="maxWait" value="10000"/>
        <property name="minEvictableIdleTimeMillis" value="30000"/>
        <property name="logAbandoned" value="true"/>
        <property name="testWhileIdle" value="true"/>
        <property name="validationInterval" value="300000"/>
        <property name="jdbcInterceptors" value="org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReport(threshold=10000)"/>
    
    </bean>
    

    阅读属性及其解释here..

    【讨论】:

      猜你喜欢
      • 2017-03-13
      • 1970-01-01
      • 2015-01-22
      • 2011-02-08
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      相关资源
      最近更新 更多