直接看下面: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();
..
}
...
...
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:环境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尚未关闭.
其他数据库暂未测试.
靠曾经就办过这恶心人的事,害的客户到后来系统都没法登了。