更正一点:
            if(con != null && !con.isClosed()) {
                con.close();
                con = null;
            }
应该是            if(con != null {
                con.close();
                con = null;
            }

解决方案 »

  1.   

    使用CachedRowSet 类 public CachedRowSetisCachedRowSetSelect() throws UnauthorizedException {
        Connection _cnn = null;
        Statement _stmt = null;
        ResultSet _rst = null;
        try {
          _cnn = DataBaseConnector.getConnection(dsJndi);
          _stmt = _cnn.createStatement();
          _rst = _stmt.executeQuery(*****);
          CachedRowSet crs = new CachedRowSet();
          crs.populate(_rst);
        }
        catch (Exception e) {
        }
        finally {
                if(con != null {
                    con.close();
                    con = null;
                }
        }
    return crs;
      }
      

  2.   

    谢谢各位。不过大家好象还没有弄清楚我的问题。
    我的问题跟 CachedRowSet 不沾边。我是说首先在构造函数中建立一个数据库连接,然后其他的方法都使用这个连接,这里所谓的“其他的方法”可能会在很短的时间里被调用很多次(如在同一个 jsp 页面中调用几十次),如果在每个方法中都取得连接,方法结束释放连接,这样在一个 jsp 页面中会有很多次获取又释放连接的过程。我知道连接是从连接池中取的,但从连接池中取很多次又释放很多次应该也不如只取一次释放依次效率高吧?
      

  3.   

    另外,一个题外话, WAPQQ 可能没看见我上次转的一个帖子,在方法的最后,应该释放所有的资源 ResultSet, Statement, Connection.这主要有两个原因:
    1。各种 JDBC Driver 都会有 bug, 只调用 Connection.close() 可能并没有真正释放资源。
    2。数据库连接池。现在应用服务器都有连接池的,Connectioin.close() 方法并没有真正释放连接,而是把连接归还到连接池,这样一个连接可能会有几百个 Statement 处于活动状态,占据资源。所以,应该 close everything
      

  4.   

    您说的不对,连接池技术之所以推荐使用是因为他把多个连接放到内存等待使用,效率是非常高的,当多人同时使用一个连接读取数据库时非常容易发生错误,而且效率低下甚至非常消耗系统资源,并非您所想的那样。还是建议您建立连接池,这样做的好处:1000个用户同时访问,各自取各自的连接,用完了仅仅是放回来的问题CLOSE(),而非DESTORY的问题。
    TOMCAT已经提供了池的连接方法,配置好后用就是了,建议您把连接方法写成BEAN,以后每次实例化一下就OK了,对您对访问者都是非常有好处的
      

  5.   

    呵呵,您真的钻了牛角尖了,连接池是占用内存,但这是您可以控制的,你可以定义一个池最大允许多少个连接,空闲时间等等,我想您应该知道多个用户使用一个连接的缺点吧。
    释放所有资源是对的,这是您应该写在我说的那个BEAN里的,CLOSE()方法包括释放所有的资源,但除了一个:池。
      

  6.   

    gzyf(老虫)你好,我不知道我的哪句话让您觉得我没有使用连接池,也不知道哪句话让您觉得我把一个连接给了多个用户同时使用,请指教。
      

  7.   

    gzyf(老虫),非常感谢您回答我的问题,但您对我的问题的理解跟实际差太多了,也许是我的表达太差??:)
    是什么让您觉得我没有写进 bean, 又是什么让您觉得我说的占用资源是占用内存?
      

  8.   

    感谢大家的回复,但我想我有必要重新指明一下我的问题所在,我弄不明白的是:如果有一个类有几个方法会在短时间内(如同一个 jsp 页面中)调用 1000 次,现在有两种方式:
    第一种:类实例化的时候生成一个数据库连接,调用方法的时候不取连接,而是用类的实例中已取得的连接,1000 次调用结束后,调用 close() 方法释放资源。
    第二种:每个方法中都首先取得数据库连接,方法结束就释放我的问题就是,这两种方式执行起来在时间上会有多少差别?我还是先自己作个试验好了。