客户端异常关闭时的Oracle活动会话状态

时间:2014-05-13 16:30:11

标签: java oracle jdbc session-timeout

美好时光。

前几天,我们的数据库团队检测到会话中有一个' ACTIVE'不再处于活动状态的客户端的状态。调查显示,此类问题有两个主要来源:

  1. 远程SQL Developer连接(实际上,这种情况不是很有趣),
  2. 异常tomcat(我们的应用程序运行的地方)关闭(例如' kill -9')
  3. 对我而言,所有会议都在“活动”中是很奇怪的。状态。有人可以澄清一下这可能是什么(也许有一些基础进程在相应的套接字上等待或者......就一切正常的tomcat关闭一切正常,似乎根本原因是事务。 ..)?

    如果我们设置了IDLE_TIME'它会有所帮助吗? (适用于所有连接)和' EXPIRE_TIME' (对于我们所有的RAC实例)?

    我是否应该采取以下方案(设置上述参数):

    1. 当客户连接时,会话被标记为' ACTIVE'
    2. 不尊重' ACTIVE'状态,有一个' ping'过程,由EXPIRE_TIME' ping客户端的参数。
    3. 如果ping过程在EXPIRE_TIME时间段内失败,即使会话处于“活动状态”,该会话也会被oracle杀死。
    4. 如果客户响应ping,但没有进行任何处理,则在IDLE_TIME时间段之后,它的会话将变为“非活动”状态。并且(如果设置了' IDLE_TIME'参数)一段时间后 - ' SNIPED'。之后,一个' SMON'流程会为此会话(以及具有' SNIPED'状态的其他人)启动内务活动。
    5. 更新

      似乎处理这种情况的唯一方法是配置Oracle实例。 有调查结果:

      • https://community.oracle.com/thread/873226?start=0&tstart=0

          

        对于死连接检测,使用服务器端sqlnet.ora文件   参数SQLNET.EXPIRE_TIME =<#of minutes>

             

        另一个选项是在配置文件设置中实现idle_time。然后用一些工作杀死SNIPED会话(当idle_time将是   达到,会议将从INACTIVE到SNIPED)。

             
             

        如果我打开一个连接然后去吃午餐,那么IDLE_TIME限制就会出现   导致我的会话在15分钟不活动后终止。一个   EXPIRE_TIME为15分钟,只会让Oracle向我发送数据包   客户端应用程序,以验证客户端是否已失败。如果   客户端已启动,它将回答ping,我的会话将保持不变   无限期。 EXPIRE_TIME只会导致会话被杀死   客户端应用程序无法响应ping,暗示着   客户端进程失败或客户端系统失败。   IDLE_TIME会杀死一段时间内没有活动的会话   时间,但这通常不适用于那些应用程序   维护一个连接池,因为假设有那个   连接池将有相当数量的空闲连接   对于一天中的某些时段以及自使用连接的应用程序   游泳池往往对游泳池中的连接造成不良反应。

      • https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2233109200346833212

          

        默认情况下,TCP / IP不会因设计而中断。当一个   连接消失,客户端和/或服务器不会立即获得   收到通知。因此,如果您的客户端连接到数据库并且什么也不做   你拔掉你的客户端(蓝屏,杀死它,拔出网线,崩溃计算机,等等)可能性很大   将留在数据库中。服务器不会知道它永远不会   收到你的消息。如果,我们有死客户端检测   这成了一个问题:

             

        http://download.oracle.com/docs/cd/B12037_01/network.101/b10776/sqlnet.htm#sthref476

             

        至于活跃的会话,这真的很容易。你打开一个连接,   您通过此连接提交请求,例如"锁定表T"。表t   在您的会话中被您的交易锁定。然后你提交一个块   代码如:

             

        开始循环dbms_lock.sleep(5);结束循环;结束; /

             

        只要该代码正在运行,您的会话就会处于活动状态 -   客户端进程在等待服务器的套接字读取时被阻止   发回一个结果 - 一个回复(当然永远不会到来)。该   服务器现在还没有触及网络 - 它处于活动状态   你的代码。所以,如果你的客户“死了”。现在 - 代码块   将继续运行,运行和运行 - 因为它从未提交 -   它只是挂在那里然后跑,当然还有任何你想要的锁   留在原地。

      • http://www.databaseskill.com/4267817/

      • http://www.dba-oracle.com/t_connect_time_idle_expire_timeout.htm

          

        sqlnet.expire_time参数用于设置时间间隔   分钟,以确定应该发送探测的频率来验证   客户端/服务器连接处于活动状如果你需要确保   连接不会无限期地保持打开(或者直到设定的时间)   操作系统特定的参数),你应该设置一个值   大于0.这可以保护系统免受打开的连接   由于客户端异常终止。

      • https://asktom.oracle.com/pls/apex/f?p=100:11:0::NO::P11_QUESTION_ID:453256655431

          

        如果会话正在等待资源锁定或锁存,如果是这样   等待时间超过了配置文件中的idle_time设置,会话   即使会话正处于交易中,也会被狙击   等待锁定等。

             

        如果是,警报日志中是否会有任何条目。

             

        跟进

             

        如果等待锁定,则表示您处于活动状态 - 而不是闲置。

             
             

        在我获得Oracle支持之前六个月,这些页面引起了我的注意   对于Data Guard问题,所以Oracle的一个人注意到我使用了   Idle_Time,他告诉我这个参数不能很好地工作   因为Oracle不会释放标记的会话资源   剪断,直到下次用户尝试使用它(等待   告诉你的会话被杀,要清除会话资源)

             

        跟进

             

        ......经过调查......"会议"那是那个   在客户承认之前不会消失,但是   "交易"走了。

             
             

        Tom,我已经改变了一个配置文件,让IDLE_TIME = 240(4小时)并制作完成   确保我的resource_limit参数设置为TRUE。当我查询   v $ session我看到了一些" snipped"会议,但也"不活跃"那个   已经闲置了一天多。所有这些用户都有此个人资料   分配给他们。如果用户会话在idle_time之前连接   已经确定,这些会议是否会受到这种变化的影响?我'已经   很久以前就做了一个改变。还有什么我应该做的   做过吗?

             

        跟进

             

        如果在设置idle_time之前连接了用户会话,   他们已经过了#34;在 - 他们不会被狙击。它只是   影响新会议。

      • http://agstamy.blogspot.ru/2011/03/profile-and-resource-limit.html

      • 其他内容和建议:https://rebby.com/blog.php?detail=32

1 个答案:

答案 0 :(得分:0)

我们检查了上述调查中列出的参数,一切正常!