1 采用数据库连接池,close资源非常昂贵2 close之后马上赋值为null,标志其可以被回收

解决方案 »

  1.   

    哈哈, 我也发现过这个问题,  我的解决方法是不用它了,  我在有关资料上看到这是dbcp这个包的一个BUG, 所以我就不用了。。 另外也可以加大最大联接数,但是这个方法不太好的!
      

  2.   

    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    Statement statement = null;
    这几句话什么意思啊,都是空,下面还关什么连接啊
      

  3.   

    我用的MSsql,和tomcat的连接池按f5几分钟也没有你出现的情况啊
      

  4.   

    你在没有close 以前就把引用置为null了,这样还怎么样关闭连接和statement啊?所以你的连接根本就没有关闭..你的close()方法写的不对.
      

  5.   

    是你的connection.close可能没有执行,因为你的connection是null,你在
    if (connection != null) {
       connection.close();
     }
    中间加一条System.out.println()看看close执行没有
      

  6.   

    我可没发现dbcp有关闭连接的bug,我以前也遇到过恶意刷新窗口tomcat就down掉的情况,但是就是由于连接没有关闭造成的...如果关闭了连接..就没有这样的情况了...
      

  7.   

    大伙帮帮忙,我修改了一下连接的类package com.squares.bj.tools;import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.sql.DataSource;/**
     * 用于操作Tomcat Mysql连接池的类
     * <p>
     * 
     * @version 1.0 2004-10-07
     * @author squares
     */public class DataBaseMysqlPool {    private static Context context;    private static DataSource dataSource;    private Connection connection;    private PreparedStatement preparedStatement;    private ResultSet resultSet;    private Statement statement;    /**
         * Init Connection
         * <p>
         */    static {        try {
                context = new InitialContext();
                dataSource = (DataSource) context
                        .lookup("java:comp/env/jdbc/Mysql");        } catch (Exception e) {
            }    }    /**
         * Close Connect
         * <p>
         * 
         * @throws SQLException
         */    public void Close() {        try {            if (resultSet != null) {
                    resultSet.close();
                    resultSet = null;
                }
                if (statement != null) {
                    statement.close();
                    statement = null;
                }            if (preparedStatement != null) {
                    preparedStatement.close();
                    preparedStatement = null;
                }            if (connection != null) {
                    connection.close();
                    connection = null;
                }        } catch (SQLException e) {
                
                System.out.println("1"+e.getMessage().toString());
                
            } finally {            if (resultSet != null) {
                    try {
                        resultSet.close();
                    } catch (SQLException e) {
                        System.out.println("2"+e.getMessage().toString());
                    }
                }            if (statement != null) {
                    try {
                        statement.close();
                    } catch (SQLException e) {
                        System.out.println("3"+e.getMessage().toString());
                    }
                }            if (preparedStatement != null) {
                    try {
                        preparedStatement.close();
                    } catch (SQLException e) {
                        System.out.println("4"+e.getMessage().toString());
                    }
                }            if (connection != null) {
                    try {
                        connection.close();
                    } catch (SQLException e) {
                        System.out.println("5"+e.getMessage().toString());
                    }
                }        }    }这个里面没有报错,不过每次刷新多了以后struts的action倒是有抛出异常!2004-12-20 14:50:19 org.apache.struts.action.RequestProcessor processException
    警告: Unhandled Exception thrown: class java.lang.NullPointerException
    2004-12-20 14:50:19 org.apache.struts.action.RequestProcessor processException
    警告: Unhandled Exception thrown: class java.sql.SQLException最后就是这种错误
      

  8.   

    finally中的内容完全没有必要,如果在关闭数据库的时候抛出异常了,那么就算你再次关闭又有什么用呢,不还是再次抛出异常吗?所以说你这个地方没有必要用finally!多此一举!而你遇到的问题..恐怕未必是连接池抛出来的,你的程序中没有连接数据库的部分,你是如何连接数据库的呢?或许你的一些操作在同步上出了问题...
      

  9.   

    Connection connection = null;
            PreparedStatement preparedStatement = null;
            ResultSet resultSet = null;
            Statement statement = null;你的所有的对象都是新建的,且都指向NULL,后面的TRY CATCH 有用吗?
      

  10.   

    我得连接池是Tomcat内置的,在配置文件配置好了用这个调用            context = new InitialContext();
                dataSource = (DataSource) context
                        .lookup("java:comp/env/jdbc/Mysql");
    可是我现在改成这样    public void Close(ResultSet resultSet, PreparedStatement preparedStatement,
                Connection connection) {        try {            if (resultSet != null) {
                    resultSet.close();
                    resultSet = null;
                }            if (preparedStatement != null) {
                    preparedStatement.close();
                    preparedStatement = null;
                }            if (connection != null) {
                    connection.close();
                    connection = null;
                }        } catch (SQLException e) {
            }    }吧连接都传进去了,关闭掉,应该没问题了吧,可是从MySql Administrator里面还是看到连接数不停的增长,状态都是sleep,哎,怎么办啊
      

  11.   

    chn217(天涯) ( ) :
    我想请问一下:
    "close之后马上赋值为null,标志其可以被回收"这句话,我有点疑问,如果不赋值为null的话,java的垃圾回收,就不会回收这个引用吗?
      

  12.   


                context = new InitialContext();
                dataSource = (DataSource) context
                        .lookup("java:comp/env/jdbc/Mysql");我知道你的是tomcat的dbcp连接池,但是上面的语句没有创建连接..你是在哪儿创建连接的?另外你的观点有误,close我们通常所说的关闭,在dbcp中并非关闭了连接,而是把连接放回到连接池中,此时的连接是不关闭的....可以看看tomcat的dbcp文档...
    另外,其实把resultset传递进来就可以了..resultset可以得到它的statement,statement 可以得到连接....都有方法..最后,把resultset作为参数传递其实也是有问题的...不过这个是一个普遍的问题...如果天涯的说法正确("close之后马上赋值为null,标志其可以被回收"),那么即使用参数传递resultset也不能保证内存的释放,因为java的参数传递,传递的是引用的副本,虽然你把当前的引用置为null了,可是原来的引用是没有被置为null的,这就要看java的垃圾回收是否会回收这样的引用,正因为如此我才会问   天涯那个问题,
      

  13.   

    明白了,我是用的Struts,你说的那个创建连接我有一个方法 connection = dataSource.getConnection();现在我得代码里面,调用几次数据库操作就多几个线程,及时线程不关闭放在池子里不要紧,主要一直不停的刷新就完蛋了 …… 因为连接我设置的最多100线程,到了100继续用没问题,但是如果恶意刷新很快就完蛋了晕