一段代码如下:
public ResultSet exec_query(String sql){
try{
Statement stat=con.createStatement();
ResultSet rs=stat.executeQuery("sql");
return rs;
}catch(SQLException e){
e.printStackTrace();
return null;
}
}
这段代码封装在一个数据库访问类里,在程序的业务层直接使用ResultSet,然后关闭,Statement没有关闭,几天后程序就会出现out of memory异常,有 没可能是这个原因造成的,还有就是,如果不返回ResultSet,返回一个Collection,因为数据量很大,回不回很慢,
持久层咋设计,看了一些hibernat和ibatis感觉慢复杂的~

解决方案 »

  1.   

    public class Dao {
      Statement stat = null;
      ResultSet rs = null;
      public ResultSet exec_query(String sql){
       try{
    stat=con.createStatement();
             rs=stat.executeQuery("sql");
    return rs;
        }catch(SQLException e){
    e.printStackTrace();
    return null;
        }finally {
           try {
    if (rs != null) {
      rs.close();
    }
    if (stat != null) {
      prepStmt.close();
    }
             if (con != null) {
       con.close();
    }
           } catch (Exception e) {
             e.printStackTrace();
           }
    }
      }
    }
    连完了数据库一定要关否则多强的服务器都的完 最好配个连接池
      

  2.   

    楼上,程序是实时和DB交互的,所以就没有关闭过Connection....
      

  3.   

    WIN_ANGEL(WIN_ANGEL)返回的ReslutSet还能用么?
      

  4.   

    通用方法接收一个sql语句 返回一个装有LinkedHashMap的ArrayList集合 其中LinkedHashMap的KEY为数据库字段名 VALUE为该字段的值public static ArrayList delRes(String sql) {
      ArrayList<LinkedHashMap> list = new ArrayList<LinkedHashMap>();
      Connection conn = null;
      PreparedStatement stmt = null;
      ResultSetMetaData metaData=null;
      try {
        conn = ConDB.getCon();
        stmt = (PreparedStatement) conn.prepareStatement(sql);
        ResultSet result = stmt.executeQuery();
        metaData=result.getMetaData();
        while (result.next()) {
    LinkedHashMap v = new LinkedHashMap();
    for (int i = 1; i <= metaData.getColumnCount(); i++)
      v.put(metaData.getColumnLabel(i),result.getObject(i));
    list.add(v);
        }
      } catch (SQLException e) {
        e.printStackTrace();
      } finally {
        try {
    if (stmt != null) {
       stmt.close();
    }
    if (conn != null) {
       conn.close();
    }
        } catch (SQLException e) {
    e.printStackTrace();
        }
      }
      return list;
    }
      

  5.   

    上面程序中的v.put(metaData.getColumnLabel(i),result.getObject(i)); 这句eclipse可能会警告让你引用参数化 不用理他 不影响使用
      

  6.   

    楼主注意看上2个程序里finally以后的语句 对于try{}catch{}finally{}的组合 finally是必定会执行的(如果有怀疑可以查阅相应资料) 因此在那里关闭数据库连接
      

  7.   

    WIN_ANGEL(WIN_ANGEL) 我知道finally会执行的,但是返回的ResultSet是当前ResultSet的副本还是引用?关闭后。返回的ResultSet还可以使用么?
    谢谢您,您的第2个方法会不会比较慢?
    谢谢 WIN_ANGEL(WIN_ANGEL)
      

  8.   

    还有就是 如果不要把N多的SQL语句写在程序中?
    看过一些东西说把每个表建立一个bean,那具体的查询怎么搞?
    有没有这样的一个例子呀
      

  9.   

    可能我说的不对 但是我做过的项目和我看到过的项目 如果是用java方法访问数据库的话基本都是返回集合类的对象 因为访问数据库查询就是为了显示 封装成一个集合返回给页面迭代显示是再好不过的结果 相对于持续连接数据库给服务器带来的压力来说 处理返回集合结果的速度根本不算什么 而且本身集合类也不慢 如果没有连接池的话 而连接数据库又不关闭的话 服务器的负载是很大的1个人用还好 但是如果多个人用都连数据库 然后又都不关闭......我想就算是“深蓝”那样的超级电脑做服务器 也一样会down掉
      

  10.   

    谢谢楼上。返回集合
    后上有联系方式么??谢谢哈。。QQ,MSN?
      

  11.   

    我们公司工作时间不让上QQ 郁闷 也许晚上我可以上 我也是一个刚做J2EE的小JAVA程序员 可以互相学习交流一下 如果你想和我交流的话可以把你的QQ给我 我晚上加你 我是上星期才在这里注册的 感觉自己好差啊 这里的高手太多了 还要继续学习~