我们使用瘦JDBC驱动程序在Weblogic上运行针对Oracle 11g DB的JavaEE应用程序。 最近我们在生产中发生了一系列事件,其中某些表格的更新和插入被卡住或花费的时间比正常情况长得多,没有明显的原因。 这导致应用程序使用越来越多的数据库连接(通常在连接池中空闲),数据库CPU和并发性(如OEM中所示)和整个数据库都停止运行。 在这些事件期间,DBA找不到插入和更新被卡住的任何原因(没有数据库锁)。他们看到的是很多“ SQL * Net wait message from client ”事件。
他们的理论是app(jdbc客户端)在插入/更新语句期间因某种原因而与DB无关,而不承认DB对这些语句的响应。事实上,应用程序继续发出越来越多的这些语句来占用越来越多的连接,这就是CPU和并发性上升的原因,使得数据库没有响应。
我不相信 - 如果所有会话都忙着等待客户,那么CPU怎么这么高? 我们无法始终如一地重现这些事件,所以我们真的在黑暗中......
有没有人见过这样的事情或有任何想法,建议这可能是由什么造成的?
由于
答案 0 :(得分:1)
您所描述的是“连接风暴”。配置错误的连接池将通过打开服务等待请求的新连接来“处理”缓慢响应的连接。这些额外的请求对已经受到压力的服务器造成了进一步的压力(如果没有强调,初始连接将不会滞后)。这启动了一个不良响应的循环,产生了额外的连接,最终导致服务器死亡。
您可以通过将数据源的最大容量设置为合理的值来避免连接风暴。 “合理”的定义将根据您的服务器的功能而有所不同,但可能比您想象的要低。最好的建议是将Maximum Capacity设置为与Initial Capacity相同的值。
一旦阻止了连接风暴,您就可以专注于导致初始减速的数据库进程。
大量SQL*Net wait message from client
事件表明客户端正在做某事而不联系数据库。这就是为什么你的DBA认为问题在于app。
答案 1 :(得分:1)
我遇到了类似的问题,我在此处记录了这些问题:Unkillable Oracle session waiting on "SQL*Net message from client" event。就我而言,问题是由CLOB
类型的绑定变量引起的,该绑定变量绑定到CLOB
似乎在Oracle中导致严重问题的地方。以下语句产生与您观察到的相同的行为:
CREATE TABLE t (
v INT,
s VARCHAR2(400 CHAR)
);
var v_s varchar2(50)
exec :v_s := 'abc'
MERGE INTO t
USING (
SELECT
1 v,
CAST(:v_s AS CLOB) s
FROM DUAL
) s
ON (t.s = s.s) -- Using a CLOB here causes the bug.
WHEN MATCHED THEN UPDATE SET
t.v = s.v
WHEN NOT MATCHED THEN INSERT (v, s)
VALUES (s.v, s.s);
可能除了MERGE
之外还有其他一些语句暴露这种行为也会产生僵尸会话,因为Oracle似乎运行了一些产生观察到的CPU负载的无限循环。