Hibernate 调用存储过程规范问题【急】

gohands 2009-04-09 10:15:55
正常应该这样写

tx = session.beginTransaction();
Connection con=session.connection();
String procedure = "{call batchUpdateCustomer(?) }";
CallableStatement cstmt = con.prepareCall(procedure);
cstmt.setInt(1,0); //把年龄参数设为0
cstmt.executeUpdate();
tx.commit();

现在有人这样写了

Connection con=session.connection();
String procedure = "{call batchUpdateCustomer(?) }";
CallableStatement cstmt = con.prepareCall(procedure);
tx = session.beginTransaction();
cstmt.setInt(1,0); //把年龄参数设为0
cstmt.executeUpdate();
tx.commit();

造成结果:
可以正常访问,执行结果也没有错。但是
存储过程执行的10分钟里,其他人通过web服务器访问数据库中断了。
【进入系统登录界面,但是却无法登陆,一直在等待中。】
但是这时数据库其实是可以正常访问的,
数据库客户端和开发人员的web服务器都可以正常使用。
请教这是为什么呀?!哪里有参考文档,谢谢。



...全文
306 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
gohands 2009-04-14
  • 打赏
  • 举报
回复
按照正常写法就没有问题,存储过程本身应该没有问题的,
不关联的表也不能操作的,而且数据库log中看不到操作的记录。
同时其他客户端是可以正常操作的。
有两种可能:1是连接池的问题,2是hibernate的问题,
必须要求按照规范来写程序。
abc25485808 2009-04-11
  • 打赏
  • 举报
回复
赞同6楼说法
gohands 2009-04-09
  • 打赏
  • 举报
回复
后一种写法,Connection.prepareCall()放在事务开始之前了,当然执行是在事务当中执行的!
prepareCall会做预编译。
[Quote=mysql文档]
注释:
Connection.prepareCall()是一种开销很大的方法,原因在于驱动程序执行的支持输出参数的元数据检索。出于性能方面的原因,应在你的代码中再次使用CallableStatement实例,通过该方式,使对Connection.prepareCall()的不必要调用降至最低。
[/Quote]
endlesspass 2009-04-09
  • 打赏
  • 举报
回复
没看出这两种写法的区别,,,只是事务开始位置不同,,,
ouyangqinxin 2009-04-09
  • 打赏
  • 举报
回复
数据库持久化事务!当然在这个时间并发也会影响系统的!
LeayAo 2009-04-09
  • 打赏
  • 举报
回复
要貌似要配置声明式事务。。
我以前有一种情况时就是操作了数据库就不能动了
加了事务就好了~
gohands 2009-04-09
  • 打赏
  • 举报
回复
使用的数据库是mysql!
lgq_0714 2009-04-09
  • 打赏
  • 举报
回复
不是hibernate的问题吧,也许是存储过程把数据库表锁死导致的
gohands 2009-04-09
  • 打赏
  • 举报
回复
两种写法都是可以正常执行的。
单独执行本身没有看不出区别,
只是第二种导致web服务器其他人不能访问数据了。

舞兮 2009-04-09
  • 打赏
  • 举报
回复
建议你使用hibernate的命名查询
<sql-update callable="true">{? = call updatePerson (?, ?)}</sql-update>
春春 2009-04-09
  • 打赏
  • 举报
回复
mysql有存储过程 吗?
jingtao8177 2009-04-09
  • 打赏
  • 举报
回复
mark..
dawn023 2009-04-09
  • 打赏
  • 举报
回复
mark.
Landor2004 2009-04-09
  • 打赏
  • 举报
回复
无法登陆,这个应该不是hibernate的问题吧,也许是存储过程把数据库表锁死导致的

67,512

社区成员

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

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