两种情况:
1、存储过程本身执行时间很长,但是中途发现问题需要终止执行的问题。
2、存储过程执行过程中网络连接断开,但是对存储过程的调用不能捕捉到异常,也无法返回。请问是否有遇到同样的问题,是如何解决的。

解决方案 »

  1.   

    但是调用存储过程时,该线程处于忙碌状态,能够close session吗?我说的是Java程序中进行控制,不能用管理员登陆数据库进行处理的情况。
      

  2.   

    1,kill掉session
    2:设置程序超时,返回
      

  3.   

    装了plsqldevelop,登录,在tools找到session,将相应的session,kiss掉..
      

  4.   


    有JAVA开发经验的来说说,应该不会出现这种情况呀。会不会你使用的代码类库有问题?
      

  5.   

    超过一定时间 进行connection.close() 关闭数据库的连接
      

  6.   

    1、如果是存储过程每次都那么慢,那么请检查过程的SQL,最好单步调试一下,一般有一两个SQL很慢的,这我遇到过一两次,这种需要优化SQL,如何优化,这个根据实际情况而定。
    2、如果是偶尔遇到,那么首先检查网络问题,网络检查很简单,只需要开一个创建执行一个最简单的SQL看是否返回也很慢即可。偶尔遇到的情况一般是这样比较多,你的过程内部有UPDATE、DELETE、SELECT FOR UPDATE操作,在多人开发系统中,可能某人(也可能是你自己的某个窗口),做了一些FOR UPDATE操作,搞忘了,事务中始终没有提交,过程一直等待锁,而得不到;这种情况也是可以通过跟踪执行过程跟踪出来的,并V$LOCKED_OBJECT 、user_objects、v$session 三个视图关联得到那个SESSION锁住了那个对象,将关联后的视图中,根据你你的对象名称找到,字段SID和SERIAL#,使用ALTER SYSTEM KILL SESSION  'SID,SERIAL#';关闭掉哪些加锁的SESSION。3、网络问题我们不把他作为问题,这是企业在生产环境需要解决的,如果是错误的话,或者过程内部捕获不到这个异常,会抛出异常,也会相当于处理完毕;如果过程内部可以对异常进行处理,但是也应该相应你的程序处理完毕了,所以中止过程的执行的可能性不大。4、交叉排队锁,这种是比较复杂一点,这种锁有点像几个过程都在运行,每个过程都会去对这些表操作,他们操作的顺序不一样,有些先得到这个表的该行的锁,有些先得到另一行,最终相互占用并等待(好比是,两个人都同时要喝茶,第一个人拿到茶叶,第二个人拿到杯子,此时两个人都在等对方的资源,都不放弃自己的资源就长期等待都喝不到茶叶),较高版本的数据库能自动检测出这种锁,并将前者释放掉,如果不能释放,导致死锁,这种情况曾在低版本数据库遇到过,对于低版本操作过程占用需要设置超时。5、分布式事务锁,ORACLE对于系统内部的对象按照块为单位,在同一个数据库内部,对同一个对象操作时,ORALCLE为了不出现当你修改多行时,在加锁的过程中还未加完锁,其它的事务将其他行加锁了,所以需要进行一个序列化的过程,但是分布式事务并非一个集群下的管理,它管不到对方的管理机制,在这个过程中很可能会引起死锁,这种情况以前我经常遇到,这个我目前也没有太好的办法,当时采用了一些治标不治本的策略方案去处理这个问题,说起来就比较多了。
      

  7.   

    感谢各位的回复,可能很多人还是不明白我的问题。问题可能出在oracle的驱动上,而且不只JDBC驱动问题。在java中调用存储过程,中间如果网络中断了,你的程序不会捕捉到任何错误,会一直等待。我在PLSQL DEVELOPER之类的工具上测试也是这样的情况,甚至在命令行SQL PLUS上测试也是如此(只能CTRL+C结束)。当然其他如死锁也会造成一样的问题,不过死锁不是我关心的。
      

  8.   


    这种情况,属于网络问题。大多也只能杀掉应用。应该来说,是oracle自身的jdbc实现不够理想。理想情况下,即算网断了,也会给出错误提示。所以,你大可不必担忧。杀掉应用之后,未完成的事务也会回退。