但现在主要是出现了第(2)个问题:(1)如果不关闭 connecton 的话,过了最大连接数就出现如下错误:2005/03/17 15:09:00:338 CST [ERROR] error <java.sql.SQLException: DBCP could not obtain an idle db connecti
on, pool exhausted>java.sql.SQLException: DBCP could not obtain an idle db conne
ction, pool exhausted
        at org.apache.commons.dbcp.AbandonedObjectPool.borrowObject(AbandonedObj
ectPool.java:123)
        at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSo
urce.java:110)
        at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource
.java:312)
(2)但如果关了的话,重复用了几次该连接池后,又得到如下的提示:2005/03/17 15:17:27:037 CST [ERROR] error <java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Object has
 been closed.>java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]
Object has been closed.
        at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source
)
        at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
        at com.microsoft.jdbc.base.BaseConnection.validateClosedState(Unknown So
urce)
        at com.microsoft.jdbc.base.BaseConnection.createStatement(Unknown Source
)
        at com.microsoft.jdbc.base.BaseConnection.createStatement(Unknown Source
)
        at org.apache.commons.dbcp.DelegatingConnection.createStatement(Delegati
ngConnection.java:172)----------------------------怎么回事???

解决方案 »

  1.   

    出现第(2)个问题的时候,是类似这样做的:在 Action 的 execute 方法中:{/* 说明:这个连接池中配置的连接是指向数据库 Testdb1 */DataSource datasource = getDataSource(request,"testdb");
    Connection connection = datasource.getConnection();String params = querySomeParams(connection);others(params);connection.close();}void others(String params) {
    .... /* 说明:这个新开的连接是指向数据库 Testdb2 */ Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
    Connection conn = DriverManager.getConnection(URL,userName,password);
    ....
    conn.close();
    }说明的一点是:上面的两个连接,都是用到了同样的驱动:com.microsoft.jdbc.sqlserver.SQLServerDriver只是URL不同,而且该驱动是放在 Tomcat 的 share/lib 目录下!------------------------另外,发现如果不调用 others 方法,其他方法无论使用多少次都不会出现(2)的情况!!!是什么冲突了吗????
      

  2.   

    出现第(2)个问题的时候,是类似这样做的:在 Action 的 execute 方法中:{/* 说明:这个连接池中配置的连接是指向数据库 Testdb1 */DataSource datasource = getDataSource(request,"testdb");
    Connection connection = datasource.getConnection();String params = querySomeParams(connection);others(params);connection.close();}void others(String params) {
    .... /* 说明:这个新开的连接是指向数据库 Testdb2 */ Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
    Connection conn = DriverManager.getConnection(URL,userName,password);
    ....
    conn.close();
    }说明的一点是:上面的两个连接,都是用到了同样的驱动:com.microsoft.jdbc.sqlserver.SQLServerDriver只是URL不同,而且该驱动是放在 Tomcat 的 share/lib 目录下!------------------------另外,发现如果不调用 others 方法,其他方法无论使用多少次都不会出现(2)的情况!!!是什么冲突了吗????
      

  3.   


    [应该关闭,但是这个关闭的意思不是说关掉连接,而是把连接重新放到连接池里面,等待下次的调用。]不是下面这个关吗?connection.close();
      

  4.   

    [
    我觉得应该称为释放连接而不是关闭连接吧!释放连接就是将连接返还到连接池中,如果连接使用完成之后就直接关闭,那连接池不就失去作用了吗?
    ]不是下面这个做法吗?connection.close();
      

  5.   

    我用tomcat测试过这个问题,连接的是sql server.如果执行了connection.close(),从sql server企业管理器中,根本就看不到一个连接。如果不关闭,倒是总能有2到3个的连接。我坐的操作就是获得连接后执行一个update语句。2个人用ie狂刷那个页面(按住f5),让同事察看sql server,结果有3个连接。1个人刷的时候有2个。所以我觉得还是不要connection.close();,因为这个操作真的是关闭了连接,而不是释放。
      

  6.   

    让我不理解的是,你这个others方法为什么又要自已去创建连接,而不从池中去取得连接呢?struts是支持多数据源的呀?还有你出第(2)个问题的异常时,是程序执行到conn.close();还是执行到connection.close();时抛出的呀?void others(String params) {
    .... /* 说明:这个新开的连接是指向数据库 Testdb2 */ Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
    Connection conn = DriverManager.getConnection(URL,userName,password);
    ....
    conn.close();
    }
      

  7.   

    需要关闭,但是conn.close()并不是真正意义上的关闭了数据库连接,而是让连接池回收这个资源以等待你的下次使用!
      

  8.   

    Quote: haozhangpk(步惊云) 
    [
    让我不理解的是,你这个others方法为什么又要自已去创建连接,而不从池中去取得连接呢?struts是支持多数据源的呀?还有你出第(2)个问题的异常时,是程序执行到conn.close();还是执行到connection.close();时抛出的呀?
    ]注意是在有others方法被执行时,重复执行Action的execute方法多次后,出现(2)问题,肯定不是 others 方法里面的错误,因为在others里面没显示任何错误!至于所说的“为什么又要自已去创建连接,而不从池中去取得连接”,是因为只有驱动程序是固定不变的,但数据库连接 URL 是用户自己填的(可自定义连接用户的数据库),所以不能用配置的数据源中取!
      

  9.   

    从连接池中取出的连接,在调用close()方法时,它实际上是将连接返回到池中,等待下次调用,并不会关闭连接,这是通过java的代理机制(实现一个java.lang.reflect.InvocationHandler接口)来实现的,不关闭将会导致连接创建更多的连接,在设定了最大连接数的连接池中,有可能没有连接可用。
    其它方式得到的连接,在调用close()方法时,会关闭实际的数据库连接
    无论用哪种方式,都应该在使用过后调用方法close(),以释放资源。
      

  10.   

    Quote:flyxxxxx(灭神)
    [
    从连接池中取出的连接,在调用close()方法时,它实际上是将连接返回到池中,等待下次调用,并不会关闭连接,这是通过java的代理机制(实现一个java.lang.reflect.InvocationHandler接口)来实现的,不关闭将会导致连接创建更多的连接,在设定了最大连接数的连接池中,有可能没有连接可用。
    其它方式得到的连接,在调用close()方法时,会关闭实际的数据库连接
    无论用哪种方式,都应该在使用过后调用方法close(),以释放资源。
    ]重写了一个连接池,用了 InvocationHandler ,的确是这样!发现这样用连接池非常好!但我说的第(2)个问题还是一样!-_-!!!
      

  11.   

    楼上的N位大哥,怎么配置MYSQL的数据库连接池呀,struts-config里各个属性怎么写呀,还有需要什么Jar文件他们都放在那些文件夹里呀???
      

  12.   

    要得,要得,我试过,不关闭的话,我设置最大连接数为4,我刷到第五次,果然出错,嘿嘿! -_#就像<国产007>里达文西发明的电灯一样,没有光肯定不会亮,哈哈!:P