JDBC的疑惑?

fuyou001 2008-01-03 12:48:42
public BookDetails getBookDetails(String bookId) throws Exception {
Connection con=null;
PreparedStatement prepStmt=null;
ResultSet rs =null;
try {
con=getConnection();
String selectStatement = "select * " + "from books where id = ? ";
prepStmt = con.prepareStatement(selectStatement);
prepStmt.setString(1, bookId);
rs = prepStmt.executeQuery();

if (rs.next()) {
BookDetails bd = new BookDetails(rs.getString(1), rs.getString(2), rs.getString(3),
rs.getFloat(4), rs.getInt(5), rs.getString(6),rs.getInt(7));
prepStmt.close();//标记1

return bd;
}
else {
return null;
}
}finally{
closeResultSet(rs);
closePrepStmt(prepStmt);//标记2(这个方法在类中已写好)
closeConnection(con);
}
}

为什么标记1那里关了prepStmt,而标记2的那里又要关一次?
...全文
249 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
DiligencyMan 2008-01-11
  • 打赏
  • 举报
回复
prepStmt.close();//标记1 这个去掉!

java2000_net兄弟说的有道理。我从另外一个角度说下题外话,呵呵!

呵呵,节省资源啊!一旦获取到数据,马上就断掉连接,减轻服务器的负担啊!即时关闭,第一此.next的时候就关闭啦!


jingweicool 2008-01-11
  • 打赏
  • 举报
回复

同意只在finally中close
dong_chen2007 2008-01-10
  • 打赏
  • 举报
回复

finnlay 里边不要那么写
你最好判断一下 if(rs!=null){rs.close();}
hitzfc 2008-01-10
  • 打赏
  • 举报
回复
标记1里的完全可以去掉
hanfengthinker 2008-01-08
  • 打赏
  • 举报
回复
嗯先关闭为后面再用,不用的话可以只关后面的吧
百炼钢丶 2008-01-08
  • 打赏
  • 举报
回复
学习..
洞凡都都 2008-01-08
  • 打赏
  • 举报
回复
closePrepStmt(prepStmt);//标记2(这个方法在类中已写好)
期实这个东东就是应该在finally中关闭才对啊.
因为如果程序一旦有异常.
就不能释放资源.



------------------------------------------------------
我有一朋友是做游戏开发的
他现在写书,但要找些经济来源,
所以在QQ上开课.
一节课30元.
讲诚信,不礼貌的不要参与了.
有意向的现联系我吧.
QQ:149004784
java_zhaidp 2008-01-08
  • 打赏
  • 举报
回复
这个不难:
标记1可能执行不到。
同意只在finally中close
ghfseawindy 2008-01-04
  • 打赏
  • 举报
回复
最好是加个判断,否则很容易出问题
bandaiwy 2008-01-04
  • 打赏
  • 举报
回复
如果prepStmt已经Close掉,再次Close似乎会有问题,最好加个判断.

我也有个问题,API文档中说prepStmt.close()会自动执行rs.close(),这个是否万无一失?
xiejia1919 2008-01-03
  • 打赏
  • 举报
回复
prepStmt = con.prepareStatement(selectStatement);
要是要运行的selectStatement这条SQl语句用的次数很少,也没有必要用的,也不会明显提升效果。
xiejia1919 2008-01-03
  • 打赏
  • 举报
回复
3楼的说的有道理。多次用到时要关闭以前的那个,否则后面的就不能重定向了。我以前也遇到过这个问题。
fuyou001 2008-01-03
  • 打赏
  • 举报
回复
谢谢!
YeLang2007 2008-01-03
  • 打赏
  • 举报
回复

嗯,楼上的有道理...

帮你顶...

只能来接分了...
老紫竹 2008-01-03
  • 打赏
  • 举报
回复
            if   (rs.next())   {
BookDetails bd = new BookDetails(rs.getString(1), rs.getString(2), rs.getString(3),
rs.getFloat(4), rs.getInt(5), rs.getString(6),rs.getInt(7));
prepStmt.close();//标记1

String selectStatement = ............ // 如果这里需要再次执行某个语句,则一定要把前一个关闭哦
prepStmt = con.prepareStatement(selectStatement2); // 再次拿到
。。。 // 后面的语句

return bd;
}
老紫竹 2008-01-03
  • 打赏
  • 举报
回复
提示:

如果你在try里面多次获得preStmt,就必须先关闭前一个,再获得新的才行。切记
比如
            if   (rs.next())   {
BookDetails bd = new BookDetails(rs.getString(1), rs.getString(2), rs.getString(3),
rs.getFloat(4), rs.getInt(5), rs.getString(6),rs.getInt(7));
prepStmt.close();//标记1

String selectStatement = ............ // 如果这里需要再次执行某个语句,则一定要把前一个关闭哦
prepStmt = con.prepareStatement(selectStatement2); // 再次拿到
。。。 // 后面的语句


return bd;
}
老紫竹 2008-01-03
  • 打赏
  • 举报
回复
prepStmt.close();//标记1
可以去掉,在finally里面确认关闭就可以了。
22.互助答疑系统|基于JSP+ Mysql+JDBC+SSM设计与实现(可运行源码+数据库+设计文档+lw)可运行源码(含数据库脚本)+开发文档+lw(高分毕设项目) java期末大作业毕业设计项目管理系统计算机软件工程大数据专业 内容概要:随着人民生活水平的不断提高,网络越来越普及,网络已经作为人们学习的主要平台。顺应大趋势,远程教育应运而生。人们可以从远程教育的平台获取学习资料,也可通过远程教育平台和教师作进一步的交流解除疑惑。目前国内的远程教育系统相对简单,主要方式是电子邮件、关键词查询和在线讨论三种方式。这三种方式都不是简便可行的方法,如电子邮件通常不能及时给与学生想要的答案,在线讨论需 全套项目源码+详尽文档,一站式解决您的学习与项目需求。 适用人群: 计算机、通信、人工智能、自动化等专业的学生、老师及从业者。 使用场景及目标: 无论是毕设、期末大作业还是课程设计,一键下载,轻松部署,助您轻松完成项目。 项目代码经过调试测试,确保直接运行,节省您的时间和精力。 其他说明: 项目整体具有较高的学习借鉴价值,基础能力强的可以在此基础上修改调整,以实现不同的功能。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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