正常应该这样写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服务器都可以正常使用。
请教这是为什么呀?!哪里有参考文档,谢谢。

解决方案 »

  1.   

    后一种写法,Connection.prepareCall()放在事务开始之前了,当然执行是在事务当中执行的!
    prepareCall会做预编译。
      

  2.   

    无法登陆,这个应该不是hibernate的问题吧,也许是存储过程把数据库表锁死导致的
      

  3.   

    建议你使用hibernate的命名查询
    <sql-update callable="true">{? = call updatePerson (?, ?)}</sql-update>
      

  4.   

    两种写法都是可以正常执行的。
    单独执行本身没有看不出区别,
    只是第二种导致web服务器其他人不能访问数据了。
      

  5.   

    不是hibernate的问题吧,也许是存储过程把数据库表锁死导致的
      

  6.   

    按照正常写法就没有问题,存储过程本身应该没有问题的,
    不关联的表也不能操作的,而且数据库log中看不到操作的记录。
    同时其他客户端是可以正常操作的。
    有两种可能:1是连接池的问题,2是hibernate的问题,
    必须要求按照规范来写程序。