我的项目中当页面连续刷新多次的时候,或操作数据库次数过多的时候,就报如下的错误,说数据库连接池耗尽
2009-01-15 17:56:30,875 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 0, SQLState: null
2009-01-15 17:56:30,875 ERROR [org.hibernate.util.JDBCExceptionReporter] - Cannot get a connection, pool exhausted
org.hibernate.exception.GenericJDBCException: Cannot open connection
at org.hibernate.exception.ErrorCodeConverter.handledNonSpecificException(ErrorCodeConverter.java:92)
...
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:103)
...
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:756)
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)
... 54 more
我的数据源用的时JNDI,ApplicationContext.xml中如下配置
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/qwest</value>
</property>
</bean>
然后在我的tomcat的server.xml中配置的如下(该配的都配了):、
<Resource name="jdbc/qwest" auth="Container" type="javax.sql.DataSource"/>
            <ResourceParams name="jdbc/qwest">
                <parameter>
                    <name>factory</name>
                    <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
                </parameter>
                <parameter>
                    <name>maxActive</name>
                    <value>100</value>
                </parameter>
                <parameter>
                    <name>maxIdle</name>
                    <value>50</value>
                </parameter>
                <parameter>
                    <name>maxWait</name>
                    <value>5000</value>
                </parameter>
  ...
  ...
            </ResourceParams>
</Context>
请教各位大侠帮忙看看啊,不胜感激!!!

解决方案 »

  1.   

    为何要把数据源放在 SERVER的配置文件中?个人觉得如果是轻量级的WEB开发,没必要和服务器过度耦合,用SPRING 解耦
      

  2.   

    更正一下:
    我的数据源是配置在C:\Tomcat 5.0\conf\Catalina\localhost下
    qwest.xml 里的
    不是在server.xml里的
      

  3.   

    Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted 
    这里已经说明问题,连接池耗尽!检查你的代码是否写了关闭连接代码,或者最大连接开得不够!
      

  4.   

    我的dao是继承Spring的HibernateDaoSupport,这里面不是自动管理和关闭连接么
      

  5.   


    连接池与是否使用Filter没有必须的联系的。
      

  6.   

    NoSuchElementException, 如果有数据被删除的话,保持页面的数据和数据库中的数据一致
      

  7.   

    用到了filter了,可是和数据库连接有什么关系么
    filter里是为了乱码才做的过滤器
      

  8.   

    看你用的是什么数据库。如果是SQL SERVER 2000或2005可给你一个调试的思路。从程序的最开始跟踪,同时打开SQL SERVER的企业管理器查看数据库中管理下的进程中的当前进程信息,一般是与数据库进行一次就打开一个进程(可以通过进程信息中的应用程序这个信息得知谁打开的),一个进程即代表一个连接,如果在程序中没关闭边接,则此进程会一直保留到数据库自动回收的时候。一个个仔细跟踪调试与数据库操作的代码。一般情况下一个应用程序只有一个连接保留在此进程当中,如果有相同应用程序的多个进程,则说明你的程序没有关闭数据库的连接。
      

  9.   

    在server.xml的最后的</host>之前加入类似的这段话
    <Context path="/jndi" docBase="D:\J2EE\workspace\jndi\WebRoot" reloadable="true">
         <Resource name="jdbc/freedom"      
                           auth="Container"      
                           type="javax.sql.DataSource"   
                           driverClassName="com.mysql.jdbc.Driver"      
                           url="jdbc:mysql://localhost:3306/sampledb"      
                           username="root"  
                           password=""  
                           maxActive="10"      
                           maxIdle="3"      
                           maxWait="10000" /> 
            </Context>
    docBase就是你项目的绝对路径
    Resource name=""就是你的jndi名
    其他应该看得懂吧good luck
      

  10.   

    我的qwest.xml里面有这些基本配置的,这和数据源有关系么
    我上面只是截取部分配置还有感谢11楼 ,我的数据库是mysql的