项目在运行过程中,偶现项目查询时卡死在那里,但是确认过sql并无问题,后面记录了几天的日志,发现卡死的很有规律
下面是卡死的时间点:
2019-05-24 15:33:32
2019-05-24 14:34:05
2019-05-24 13:13:28
2019-05-24 10:43:28
2019-05-24 09:13:11
2019-05-24 08:33:22
2019-05-24 07:53:22
2019-05-24 05:53:13
2019-05-24 04:44:17
2019-05-24 04-03:07
2019-05-24 02:54:21
2019-05-24 01:53:21
2019-05-24 00:23:07发现卡死时间大概都是在3分的时候,之前的几天卡死时的时间也是类似,中间重启过项目,但是卡死时间依然很凑巧是3分左右,数据库中卡死后查询时也找不到相关的死锁,项目重启后回复正常,查询的卡死的表数据量也不大,每次最多几十条数据。求各位大佬可以指条明路,大概问题可能可能出在什么地方。附上卡死时项目的jstack日志:
java.lang.Thread.State: RUNABLE
               at java.net.SocketInputStream.sockerRead0(Native Method)
               at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
               at java.net.SocketInputStream.read(SocketInputStream.java :171)
               at java.net.SocketInputStream.read(SocketInputStream.java :141)
               at oracle.net.ns.Packet.receive(Packet.java:239)
               at oracle.net.ns.DataPacket.receive(DataPacket.java:92)每次在收包的时候会阻塞在那里,导致查询不出来数据。

解决方案 »

  1.   

    这个要确定是数据库卡死了,还是应用卡死了。
    当这个情况出现的时候,你把这条语句在 Oracle 客户端中执行一下,看看是否能正常出结果。
      

  2.   


    出现这个情况之后,在数据库执行sql可以正常查询得出结果,出现问题应该是很短的时间,应用未出现死锁,内存泄漏这些情况,应该是数据库卡死导致的。同样的程序换个数据库就一切正常了。
      

  3.   

    最终还是未定位到卡死问题,查询方法为单表条件查询,很简单的查询,最终解决办法是查询那一步改为多线程查询,使用线程辅助类CountDownLatch进行线程延时处理,保证返回结果之后再继续处理,就算其中一些时候查询卡死,也不影响下一步的定时器查询;再建一个监控类,监测卡死的查询线程数,进行定时清理。该问题暂时这样解决,项目运行两周未出现问题。
      

  4.   

    如果是数据库的问题,应该是遇到了特定查询的执行计划不理想的情况,有可能是由两个功能导致的:
    1、ACS游标自适应,Oracle会随着绑定变量的值不同,自动调整SQL的执行计划,这种情况下,捞出SQL来,将实际值带入SQL再去执行看看它快慢其实是没有意义的,要看的是当时它的实际执行计划,可以通过AWR,或者dbms_xplan.display_cursor、 dbms_xplan.display_awr等方法去获取当时可能的执行计划;
    2、cardinality feedback,基数反馈功能,随着SQL中条件值的变化,SQL的执行计划也可能发生变化
    如果是这两种情况,个人觉得还是应该研究下堵塞时候的SQL以及其查询的表数据的情况,如果合适的话,可以尝试使用提示来诱导CBO选择固定的执行计划看看能否避免这种问题。
      

  5.   


    之所以说如果使用了绑定变量,将实际值代入SQL再去跑没有意义,是因为将绑定变量替换为实际值,实际上这个SQL与使用绑定变量的SQL,在文本上已经发生了变量,这根本就已经是两个SQL,生成不同的执行计划,跑出不同的性能是很正常的。
      

  6.   

    之前也曾碰到这个问题,查的结果是此TABLE 有一个trigger 关系,请查一下是否如此
      

  7.   


    这是一个思路啊,也许还可能是JOB之类的,这样的话,还需要抓下出问题时间段内的ASH报告比较好了