一个长期运行的proc程序中,如何检测数据库连接的状态了?比如我可以检测出连接异常,然后重连。

解决方案 »

  1.   

    查看v$session的信息可以得到连接状态
      

  2.   

    你的意思是V$session中Inactive就是异常了?
    而且如何确定程序使用session的sid了?
      

  3.   

    UP
    !俺也刚搞!
    支持一下!
    楼主帮忙看看俺的问题如何?
    http://community.csdn.net/Expert/topic/4141/4141308.xml?temp=.8532831
      

  4.   

    我觉得楼主应该描述清楚这个诊断是由客户端的程序来进行还是由数据库服务器来进行。我个人觉得楼主说的是前一中,那么我认为比较简单的实现是有个守护线程/进程来定时对通过该连接进行一个类似ping的测试,可以考虑执行一个类似“select user from dual”的语句
      

  5.   

    谢谢!
    是前一种.由客户端程序控制. 
    最开始是发觉每条sql语句都要判断执行状态,如果为ora-01012的话就重连,这样做比较麻烦。现在就只是把错误置位为数据库出错,在最后回滚,然后判断如果是ora-01012的话就重连。有一点不清楚的地方是,oracle把20分钟没有活动的session置为inactive,那多久oracle会把这个session清理掉?还是不清理?(没找到相关的资料)
    如果不清理,在置为inactive后如果有新的操作是否会恢复为active并正常执行请求?如果是这样的话那连接的保持应该是可以使用一些手段来 keep alive;
      

  6.   

    这个问题也在困扰着我,我一般的做法是通过EXEC SQL WHENEVER SQLERROR 来监视oracle错误,出错后的处理由调用方再重新连接数据库,也是比较麻烦的方法,希望大家能够讨论出一个通用、省事的方法。