直接看下面:function foo(){
...
try{
con = ...
PreparedStatement pstmt = con.prepareStatement("UPDATE table1 SET col1 = ? WHERE COF_NAME LIKE ? ");
pstmt.setInt(1, 60);
pstmt.setString(2, "aaa");
pstmt.executeUpdate(); 
//?pstm.close()有必要吗?
pstmt = con.prepareStatement("UPDATE table2 SET col1 = ? WHERE COF_NAME LIKE ? ");
pstmt.setInt(1, 90);
pstmt.setString(2, "bbb");
pstmt.executeUpdate(); 
}catch{
...
}finally{

...
pstmt.close();//关闭
...
con.close();
..
}
...

解决方案 »

  1.   

    不关都可以,只要connection记得关闭就ok
      

  2.   

    你可以先关闭connection,再关闭stmt,看看报错否
      

  3.   

    finally{ } 关闭次connection 足以
      

  4.   

    需要.
    测试代码如下:
    测试1:环境db2 Class.forName("com.ibm.db2.jcc.DB2Driver");
            Connection conn = DriverManager.getConnection("jdbc:db2://*****:30000/pe", "****", "*****");
            PreparedStatement stmt = null;
            ResultSet rs = null;
            for(int i=0;i<5000;i++){
                stmt = conn.prepareStatement("select "+i+" from sl_jc_sjrq where "+i+"="+i);
                rs = stmt.executeQuery();
                rs.next();
                System.out.println(i+":"+rs.getString(1)+"");
                rs.close();
                //stmt.close();
            }
            stmt.close();
            conn.close();
    结果4017:4017
    4018:4018
    Exception in thread "main" com.ibm.db2.jcc.b.SqlException: DB2 SQL Error: SQLCODE=-805, SQLSTATE=51002, SQLERRMC=NULLID.SYSLH20A 0X5359534C564C3031, DRIVER=3.50.152
    at com.ibm.db2.jcc.b.wc.a(wc.java:55)
    at com.ibm.db2.jcc.b.wc.a(wc.java:126)
    at com.ibm.db2.jcc.b.tk.c(tk.java:1901)
    at com.ibm.db2.jcc.t4.db.o(db.java:767)
    at com.ibm.db2.jcc.t4.db.g(db.java:141)
    at com.ibm.db2.jcc.t4.db.a(db.java:38)
    at com.ibm.db2.jcc.t4.t.a(t.java:32)
    at com.ibm.db2.jcc.t4.sb.h(sb.java:141)
    at com.ibm.db2.jcc.b.tk.N(tk.java:1387)
    at com.ibm.db2.jcc.b.uk.Kb(uk.java:2461)
    at com.ibm.db2.jcc.b.uk.e(uk.java:3101)
    at com.ibm.db2.jcc.b.uk.yb(uk.java:535)
    at com.ibm.db2.jcc.b.uk.executeQuery(uk.java:509)
    at Test.main(Test.java:20)
    错误信息可以百度一下.可以证明stmt占用了资源,没释放.
    把注释的代码放开.每次都关闭.不会出现问题.在mssql上测试 50000都不会有问题.数据库机理不同吧.但db2下的错误已经能证明.需要关闭.
    另用fortify等软件测试代码.findbug等都会提示stmt尚未关闭.
    其他数据库暂未测试.
      

  5.   

    通常只在finally中关闭connection必关
    靠曾经就办过这恶心人的事,害的客户到后来系统都没法登了。
      

  6.   

    pstmt,rs,connection在finally中关闭!!!