Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate异常:Spring升级后连接池耗尽错误_Hibernate_Spring_Tomcat_Spring Mvc_Apache Commons Dbcp - Fatal编程技术网

Hibernate异常:Spring升级后连接池耗尽错误

Hibernate异常:Spring升级后连接池耗尽错误,hibernate,spring,tomcat,spring-mvc,apache-commons-dbcp,Hibernate,Spring,Tomcat,Spring Mvc,Apache Commons Dbcp,我在应用程序中使用Spring+Hibernate+Dbcp+Tomcat。由于某种原因,在最近的spring升级到3.0.6版后,应用程序开始抛出以下异常 org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.Generic

我在应用程序中使用Spring+Hibernate+Dbcp+Tomcat。由于某种原因,在最近的spring升级到3.0.6版后,应用程序开始抛出以下异常

    org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection
at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:596)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:335)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy7.findURLByPattern(Unknown Source)
at com.xxx.security.DAOBasedFilterInvocationDefinitionMap.lookupAttributes(DAOBasedFilterInvocationDefinitionMap.java:80)
at org.acegisecurity.intercept.web.AbstractFilterInvocationDefinitionSource.getAttributes(AbstractFilterInvocationDefinitionSource.java:39)
at org.acegisecurity.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:236)
at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:104)
at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
at org.acegisecurity.ui.ntlm.HttpFilter.doFilter(HttpFilter.java:51)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:110)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
at org.acegisecurity.ui.logout.LogoutFilter.doFilter(LogoutFilter.java:106)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:286)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:149)
at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Thread.java:619)
    Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:420)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:119)
at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:57)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:551)
... 36 more
    Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted, cause: Timeout waiting for idle object
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:148)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:518)
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:417)
... 40 more
    Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:801)
at org.apache.commons.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:119)
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:140)
... 43 more
我的配置如下

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${db.driverClassName}" />
    <property name="url" value="${db.url}" />
    <property name="username" value="${db.username}" />
    <property name="password" value="${db.password}" />
    <property name="maxActive" value="10" />
    <property name="maxIdle" value="6" />
    <property name="maxWait" value="120" />
    <property name="defaultAutoCommit" value="true" />
    <property name="removeAbandoned" value="true" />
    <property name="removeAbandonedTimeout" value="60" />
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>

    <property name="configLocations">
        <list>
            <value>classpath:com/xxx/model/hibernate/hibernate-gas.cfg.xml</value>
        </list>
    </property>

    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect"> org.hibernate.dialect.SQLServerDialect </prop>
            <prop key="hibernate.jdbc.fetch_size">10</prop>
            <prop key="hibernate.jdbc.batch_size">50</prop>
            <prop key="hibernate.generate_statistics">true</prop>
        </props>
    </property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory">
        <ref bean="sessionFactory" />
    </property>
</bean>


<bean id="myTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref local="sessionFactory" />
    </property>
    <property name="nestedTransactionAllowed" value="true" />
</bean>

<bean id="propagationRequired" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager">
        <ref bean="myTransactionManager" />
    </property>
    <property name="transactionAttributes">
        <props>
            <prop key="select*">
                PROPAGATION_REQUIRED,readOnly, timeout_300
            </prop>
            <prop key="search*">
                PROPAGATION_REQUIRED,readOnly, timeout_300
            </prop>
            <prop key="*">
                PROPAGATION_REQUIRED, timeout_300,
                -Exception
            </prop>
        </props>
    </property>
</bean>

<bean id="propagationRequiresNew" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager">
        <ref bean="transactionManager" />
    </property>
    <property name="transactionAttributes">
        <props>
            <prop key="*">
                PROPAGATION_REQUIRES_NEW, timeout_300,
                -Exception
            </prop>
        </props>
    </property>
</bean>

类路径:com/xxx/model/hibernate/hibernate-gas.cfg.xml
org.hibernate.dialogue.sqlserverdialogue
10
50
真的
需要传播,只读,超时300
需要传播,只读,超时300
需要传播,超时300,
-例外情况
传播\u需要\u新建,超时\u 300,
-例外情况

通常我会说试试c3p0(不同的连接池实现)

然而,我认为问题在于应用程序如何处理db连接。我很想知道您正在为dbcp连接池使用哪些值(数据源配置参数)。请试着把它们寄出去

我将使用以下方法确保废弃的连接被逐出并记录:

removeAbandoned = true
logAbandoned = true
我还将尝试降低以下各项的值:

removeAbandonedTimeout

强制提前退出连接,以便您可以识别应用程序中负责保持这些连接最长时间的流。解决问题后,您可以重新调整它的值。

通常我会说尝试一下c3p0(不同的连接池实现)

然而,我认为问题在于应用程序如何处理db连接。我很想知道您正在为dbcp连接池使用哪些值(数据源配置参数)。请试着把它们寄出去

我将使用以下方法确保废弃的连接被逐出并记录:

removeAbandoned = true
logAbandoned = true
我还将尝试降低以下各项的值:

removeAbandonedTimeout
强制提前退出连接,以便您可以识别应用程序中负责保持这些连接最长时间的流。解决问题后,您可以重新调整它的值。

我也遇到类似问题。 在我的例子中,我使用了spring安全性和openSessionInViewFilter,但顺序错误。 我的spring安全代码正在打开一个连接,但从未释放它,这是在OpenSessionInViewFilter之前完成的。

我遇到了类似的问题。 在我的例子中,我使用了spring安全性和openSessionInViewFilter,但顺序错误。 我的spring安全代码正在打开一个连接,但从未释放它,这是在OpenSessionInViewFilter之前完成的。

你在问“有没有办法让我找出任何给定时间的活动和空闲连接数?”

您可以扩展BasicDataSource并获取更多信息:

public class WrapperDataSource extends BasicDataSource implements Serializable {

    private static final long serialVersionUID = 4139847655780946796L;
    private static final Logger log = LoggerFactory.getLogger(WrapperDataSource.class);

    @Override
    public Connection getConnection() throws SQLException {
        if(log.isTraceEnabled()){ 
            log.trace("Number of active connections:" + super.getNumActive());
            log.trace("Number of idle connections:" + super.getNumIdle());
            log.trace("Number of max active:" + super.getMaxActive());
        }
        return super.getConnection();
    }

    @Override
    public Connection getConnection(String username, String password) throws SQLException {
        if(log.isTraceEnabled()){ 
            log.trace("Number of active connections:" + super.getNumActive());
            log.trace("Number of idle connections:" + super.getNumIdle());
            log.trace("Number of max active:" + super.getMaxActive());
        }
        return super.getConnection(username, password);
    }
}
你在问“有没有办法让我找出在任何给定时间的活动和空闲连接数?”

您可以扩展BasicDataSource并获取更多信息:

public class WrapperDataSource extends BasicDataSource implements Serializable {

    private static final long serialVersionUID = 4139847655780946796L;
    private static final Logger log = LoggerFactory.getLogger(WrapperDataSource.class);

    @Override
    public Connection getConnection() throws SQLException {
        if(log.isTraceEnabled()){ 
            log.trace("Number of active connections:" + super.getNumActive());
            log.trace("Number of idle connections:" + super.getNumIdle());
            log.trace("Number of max active:" + super.getMaxActive());
        }
        return super.getConnection();
    }

    @Override
    public Connection getConnection(String username, String password) throws SQLException {
        if(log.isTraceEnabled()){ 
            log.trace("Number of active connections:" + super.getNumActive());
            log.trace("Number of idle connections:" + super.getNumIdle());
            log.trace("Number of max active:" + super.getMaxActive());
        }
        return super.getConnection(username, password);
    }
}

我确实试过了。但我还是得到了同样的例外。我已经编辑了问题以显示池的值。我们已经为这些属性使用了建议值。是否有一种方法可以让我在任何给定时间找出活动和空闲连接的数量?使用这些相同的值,我们在升级之前没有遇到此异常。由于c3p0也抛出了同样的错误,它迫使我认为配置有问题,但我无法将手指放在上面。你也尝试过吗?如果是这样,您应该会看到一些有趣的日志,其中包含阻塞连接的线程的stacktrace。至于查看即时统计信息,c3p0可以使用JMX进行配置,并且可以显示您需要的信息()我确实尝试过c3p0。但我还是得到了同样的例外。我已经编辑了问题以显示池的值。我们已经为这些属性使用了建议值。是否有一种方法可以让我在任何给定时间找出活动和空闲连接的数量?使用这些相同的值,我们在升级之前没有遇到此异常。由于c3p0也抛出了同样的错误,它迫使我认为配置有问题,但我无法将手指放在上面。你也尝试过吗?如果是这样,您应该会看到一些有趣的日志,其中包含阻塞连接的线程的stacktrace。至于查看即时统计信息,c3p0可以使用JMX进行配置,并可以显示您需要的信息(),您确定您的升级不会恰好与使用量激增同时耗尽您的连接池吗?如果是,则需要告诉我们数据库连接是如何打开的,以及在何处打开的,更重要的是,是如何关闭的。最后一点是导致问题的原因。但既然我使用的是Spring,这应该是一个问题吗?其他人的代码正在管理您的资源这一事实并不意味着您可以忽略它们。您仍然需要知道您的事务/连接边界在哪里,以便能够预防和排除与此完全相同的问题。您确定您的升级并不是恰好与使用量激增同时发生的,这会耗尽您的连接池吗?如果是,则需要告诉我们数据库连接是如何打开的,以及在何处打开的,更重要的是,是如何关闭的。最后一点是导致问题的原因。但既然我使用的是Spring,这应该是一个问题吗?其他人的代码正在管理您的资源这一事实并不意味着您可以忽略它们。你仍然需要知道你的t在哪里