小弟现在正进行一个项目,数据库连接使用hibernate3+spring 配置c3p0连接池
jdk 1.5  应用服务器TOMCAT 5.5.27 数据库PostgreSQL 8.3
配置文件applicationContext-hibernate.xml的片段如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd"><beans>    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:database.properties"/>
    </bean>
<!-- c3p0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
property name="driverClass" value="org.postgresql.Driver"/>
<property name="jdbcUrl" value="jdbc:postgresql://124.207.159.153:5432/edc"/>
<!-- 当连接池耗尽时候,一次获得连接数-->
<property name="acquireIncrement" value="5"/>
<!-- 连接池最大数 -->
<property name="maxPoolSize" value="10"/>
<!-- 连接池最小数-->
<property name="minPoolSize" value="5"/>

<property name="initialPoolSize" value="5"/>
<!-- 当连接池连接耗尽时,客户端getConnection(),所等待的时间-->
<property name="checkoutTimeout" value="1000"/>
<!-- 当连接失效时,或得连接的次数,0为无限次(重连)-->
<property name="acquireRetryAttempts" value="1"/>
<!-- 用户名 -->
<property name="user" value="admin"/>
<property name="preferredTestQuery" value="SELECT 1"/>
<property name="idleConnectionTestPeriod" value="18000"/>
<property name="maxIdleTime" value="25000"/>
<property name="testConnectionOnCheckout" value="true"/>
<!-- 用户密码-->
<property name="password" value="admin"></property>
</bean>在启动tomcat的时候出现异常:
java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:104)
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:65)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:234)
at com.mchange.v2.c3p0.PoolBackedDataSource.getConnection(PoolBackedDataSource.java:94)
at com.mchange.v2.c3p0.ComboPooledDataSource.getConnection(ComboPooledDataSource.java:521)
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81)
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:72)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:1463)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1004)
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:805)
at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:745)
at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:134)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1175)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1145)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:427)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:144)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:276)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:360)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:91)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:75)
at com.elink.edc.servlet.Server_Console.start(Server_Console.java:110)
at com.elink.edc.servlet.Server_Console.init(Server_Console.java:61)
at javax.servlet.GenericServlet.init(GenericServlet.java:212)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1139)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:966)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3956)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4230)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:760)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:740)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:544)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:927)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:890)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1150)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1022)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:448)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
Caused by: com.mchange.v2.resourcepool.TimeoutException: internal -- timeout at awaitAcquire()
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAcquire(BasicResourcePool.java:968)
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:208)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:232)
... 49 more
请教诸位高手,这个异常是什么意思,该如何下手解决这个异常呢???100分送上,不够再加!!

解决方案 »

  1.   

    <!-- 当连接池连接耗尽时,客户端getConnection(),所等待的时间--> 
    <property name="checkoutTimeout" value="1000"/>楼上的大虾指的是这个时间设置长一些???
      

  2.   

    An attempt by a client to checkout a Connection has timed out.  连接超时。  数据库连接不上,
    tomcat和数据库是在一台机器上吗? admin用户让连接吗? 和你的配置文件没关系。
      

  3.   

    An attempt by a client to checkout a Connection has timed out. 
    连接超时了,连接的等待时间设置长点。
      

  4.   

    共享一下我的项目中配置c3p0的配置 供lz参考<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
                <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
                <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/sodddata?useUnicode=true&amp;characterEncoding=GBK"></property>
                <property name="user" value="sodd"></property>
                <property name="password" value="sodd123"></property>
                <property name="maxPoolSize" value="40"></property>
                <property name="minPoolSize" value="1"></property>
                <property name="initialPoolSize" value="1"></property>
                <property name="maxIdleTime" value="20"></property>
            </bean>
    initialPoolSize:
    Number of Connections a pool will try to acquire upon startup. Should be between minPoolSize and maxPoolSize
    连接池初始化时获取的链接数,介于minPoolSize和maxPoolSize之间
    minPoolSize:
    Minimum number of Connections a pool will maintain at any given time.
    最小链接数
    maxPoolSize:
    Maximum number of Connections a pool will maintain at any given time.
    最大连接数
    acquireIncrement:
    Determines how many connections at a time c3p0 will try to acquire when the pool is exhausted.
    在当前连接数耗尽的时候,一次获取的新的连接数
    maxIdleTime:
    Seconds a Connection can remain pooled but unused before being discarded. Zero means idle connections never expire.
    最大空闲的时间,单位是秒,无用的链接再过时后会被回收
      

  5.   

    是啊,楼上的都说对了,
    发现一点小小的意外,原来连接池配置了,hibernate会在连接池中找连接的.
      

  6.   


    tomcat 是我本机的  数据库是在一台Debian linux服务器上的 admin用户权限肯定够 没问题 但是就是连接不上
      

  7.   

    我也遇到了这样的问题
    我的是连接上数据库,做了十几次查询操作后就变成An attempt by a client to checkout a Connection has timed out
    后来我把连接时间设的长了一些,但是还是感觉用了测试数据多了就卡死
    但是重新加载到tomcat后又可以操作了
    现在还没想好怎么解决
      

  8.   

    我昨天已经把连接本地的sql异常解决了,但是连接远程的还是出现这个异常,正在解决中!!!
      

  9.   

    我也出现过同样错误,后将下面这些注掉就可以了。就是checkoutTimeout值要注掉 <property name="checkoutTimeout">
    <value>100</value>
    </property>
      

  10.   

    15楼的意思是,将
    <property name="checkoutTimeout">
    <value>100</value>
    </property>
    这个属性注释掉,在缺省的情况下,默认 checkoutTimeout 的值为0,就是无限期等待,直到连接上为止。
    我的连接池配里就没有这个属性。可是也会报出一个警告,虽不影响系统正常运行,但总觉得别扭。
    本地tomcat,局域网Mysql数据库。以下是警告信息。希望大虾们给与帮助....
    --10:17:44,000 WARN :com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector. com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1e8ce62 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
    --10:17:44,062 WARN :com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector. com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1e8ce62 -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 3
    Active Threads: 3
    Active Tasks: 
    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1d9e040 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1119a16 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@9b2735 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
    Pending Tasks: 
    com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@2b32f1
    Pool thread stack traces:
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
    java.net.SocketInputStream.socketRead0(Native Method)
    java.net.SocketInputStream.read(SocketInputStream.java:129)
    com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113)
    com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160)
    com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188)
    com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1910)
    com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:501)
    com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:971)
    com.mysql.jdbc.Connection.createNewIO(Connection.java:2670)
    com.mysql.jdbc.Connection.<init>(Connection.java:1531)
    com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
    com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135)
    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
    com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
    com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
    com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
    java.net.SocketInputStream.socketRead0(Native Method)
    java.net.SocketInputStream.read(SocketInputStream.java:129)
    com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113)
    com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160)
    com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188)
    com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1910)
    com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:501)
    com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:971)
    com.mysql.jdbc.Connection.createNewIO(Connection.java:2670)
    com.mysql.jdbc.Connection.<init>(Connection.java:1531)
    com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
    com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135)
    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
    com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
    com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
    com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
    java.net.SocketInputStream.socketRead0(Native Method)
    java.net.SocketInputStream.read(SocketInputStream.java:129)
    com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113)
    com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160)
    com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188)
    com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1910)
    com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:501)
    com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:971)
    com.mysql.jdbc.Connection.createNewIO(Connection.java:2670)
    com.mysql.jdbc.Connection.<init>(Connection.java:1531)
    com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
    com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135)
    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)
    com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
    com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
    com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
    com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
      

  11.   

    配置文件中的这里设置好就没问题了:c3p0.checkoutTimeout = 20000注意单位是 毫秒这个设置建立数据库连接 也就是获得 connection的时间 ,太短就会出这个事情。
      

  12.   

    相同的问题啊。应该是数据库缓冲池用尽,导致无法再使用造成的。
    而形成缓冲池用尽的原因据说是没有释放hibernate的session,但我的session都是通过hibernatedaosupport中提供的回调函数来管理并用aop添加事务来管理的啊,如下
    HibernateCallBack匿名内部类的doInHibernate(session)方法的传入参数
    通过该方法将session暴露给spring容器进行切面事务管理。
    难道是哪里的代码还用到了session,并且该session无法被spring的事务管理?
      

  13.   

    另外,数据库缓冲池的使用情况可以通过mysql提供的administrator 工具中的health选项查看。