项目在运行过程中,偶现项目查询时卡死在那里,但是确认过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)每次在收包的时候会阻塞在那里,导致查询不出来数据。
下面是卡死的时间点:
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)每次在收包的时候会阻塞在那里,导致查询不出来数据。
解决方案 »
- oracle中哪个函数可以生成随机数
- 关于ORACLE的安装~
- Unable to compile class for JSP 神马东东啊?
- 有关触发器和临时表的问题,求高手指点……
- sql case 查询
- Encountered the symbol "+" when expecting one of the following:(The symbol "(" was substituted for "+" to continue. oracle报错
- ora-00904问题
- Red hat AS3 中如何同时启动两个数据库实例 oracle9i
- Oracle中是否有察看表中记录的工具
- 一句SQL挑战。分不够再加。
- Oracle rman备份还原命令写成批处理
- oracle explain 分析 SQL 时, buffer sort 耗时将近 16K 大概是怎么回事呢?
当这个情况出现的时候,你把这条语句在 Oracle 客户端中执行一下,看看是否能正常出结果。
出现这个情况之后,在数据库执行sql可以正常查询得出结果,出现问题应该是很短的时间,应用未出现死锁,内存泄漏这些情况,应该是数据库卡死导致的。同样的程序换个数据库就一切正常了。
1、ACS游标自适应,Oracle会随着绑定变量的值不同,自动调整SQL的执行计划,这种情况下,捞出SQL来,将实际值带入SQL再去执行看看它快慢其实是没有意义的,要看的是当时它的实际执行计划,可以通过AWR,或者dbms_xplan.display_cursor、 dbms_xplan.display_awr等方法去获取当时可能的执行计划;
2、cardinality feedback,基数反馈功能,随着SQL中条件值的变化,SQL的执行计划也可能发生变化
如果是这两种情况,个人觉得还是应该研究下堵塞时候的SQL以及其查询的表数据的情况,如果合适的话,可以尝试使用提示来诱导CBO选择固定的执行计划看看能否避免这种问题。
之所以说如果使用了绑定变量,将实际值代入SQL再去跑没有意义,是因为将绑定变量替换为实际值,实际上这个SQL与使用绑定变量的SQL,在文本上已经发生了变量,这根本就已经是两个SQL,生成不同的执行计划,跑出不同的性能是很正常的。
这是一个思路啊,也许还可能是JOB之类的,这样的话,还需要抓下出问题时间段内的ASH报告比较好了