PreparedStatement使用两次,需要两次close()吗

c3tc3tc3t 2011-01-14 09:00:02
例如
PreparedStatement pstmt = null;
sql=select * from user;
pstmt=connection.prepareStatement(sql);
pstmt.executeQuery();

psmt.close()//这里需不需要也关闭一次?

sql2=select * from titles;
pstmt=connection.prepareStatement(sql);
pstmt.executeQuery();

psmt.close()//这里关闭一次

PreparedStatement使用两次,需要两次close()吗,希望说说理由
...全文
1667 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
herozhxing 2013-09-03
  • 打赏
  • 举报
回复
引用 16 楼 qingralf 的回复:
晕.谁能编辑帖子...我要删除用户名密码信息.......
coooliang 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 redlotus_lyn 的回复:]
需要

因为执行一次产生一个游标,不关会游标累加。
[/Quote]

我平常不会关它
因为我认为
pstmt这个 引用
在第二次调用
pstmt=connection.prepareStatement(sql);
这句话的时候指向了另一个新创建的对象 而原来的对象会被垃圾回收



舞黯然 2011-01-14
  • 打赏
  • 举报
回复
不需要
cy729215495 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liuchao1989 的回复:]

关闭PreparedStatement 对象是让服务器好重新分配数据库连接,不让当前程序一直占用,而你下面接下来又进行了查询,所以不需要关闭。
[/Quote]

差矣。connection才是连接,
PreparedStatement 是预编译sql的statement.
connection.prepareStatement(sql)只是创建一个 PreparedStatement 对象.调用2次,会创建2个对象
和Connection一样,如果不调用close方法,系统在垃圾回收的时候也会自动的给你关闭。


psmt.close()//这里需不需要也关闭一次?

我的建议是这里一定要关闭。调用它以后,会释放PreparedStatement 所占用的数据库和jdbc的资源。

你这种写法,本来就不正确。一个连接里面一般都是只做一次sql操作。要么就分开,重新开辟一个连接。

铁匠梁 2011-01-14
  • 打赏
  • 举报
回复
用一次关一次,养成良好习惯。
之前的故障:
循环中进行 connection.prepareStatement(sql); 把游标给耗尽了。
redlotus_lyn 2011-01-14
  • 打赏
  • 举报
回复
需要

因为执行一次产生一个游标,不关会游标累加。

donghua123 2011-01-14
  • 打赏
  • 举报
回复
PreparedStatement 是预编译的 不需要
licip 2011-01-14
  • 打赏
  • 举报
回复
是的。不需要。
cao570366997 2011-01-14
  • 打赏
  • 举报
回复
只要关闭一次即可
UPC_思念 2011-01-14
  • 打赏
  • 举报
回复
直接用就行了,最后关闭
tt986101dpc 2011-01-14
  • 打赏
  • 举报
回复
不需要。
liuchao1989 2011-01-14
  • 打赏
  • 举报
回复
关闭PreparedStatement 对象是让服务器好重新分配数据库连接,不让当前程序一直占用,而你下面接下来又进行了查询,所以不需要关闭。
god1298 2011-01-14
  • 打赏
  • 举报
回复
不需要,只要关闭一次就可以
红酒&电影 2011-01-14
  • 打赏
  • 举报
回复
这里不需要
qingralf 2011-01-14
  • 打赏
  • 举报
回复
晕.谁能编辑帖子...我要删除用户名密码信息.......
qingralf 2011-01-14
  • 打赏
  • 举报
回复
需要.
测试代码如下:
测试1:环境db2

Class.forName("com.ibm.db2.jcc.DB2Driver");
Connection conn = DriverManager.getConnection("jdbc:db2://197.3.5.131:30000/pe", "uperxia", "AB1BsO7U");
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尚未关闭.
其他数据库暂未测试.
dinghao 2011-01-14
  • 打赏
  • 举报
回复
不需要关闭2次。
首先纠正楼上的,pstmt是同一个对象,不会被垃圾回收。
其次,pstmt可以放在finally里面关闭。
哪怕抛出异常也可以关闭释放资源

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧