Weblogic Stuck Thread на вызове JDBC - PullRequest
       17

Weblogic Stuck Thread на вызове JDBC

5 голосов
/ 22 декабря 2010

Мы часто получаем серию тем Stuck на наших серверах Weblogic. Я проанализировал это за период времени.

Что я хотел бы понять, так это то, указывает ли этот застрявший блок потока на , что он все еще считывает данные из открытого сокета в базу данных , поскольку запросы - это просто SELECT?

at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:129)
        at oracle.net.ns.Packet.receive(Packet.java:239)
        at oracle.net.ns.DataPacket.receive(DataPacket.java:92)

Мы выполнили команды netstat и другие, сокеты от сервера приложений Weblogic до базы данных соответствуют количеству соединений в пуле.

Есть идеи, что еще мы должны здесь исследовать?

Трассировка стека дампа потока:

"[STUCK] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=0x61a5b000 nid=0x25f runnable [0x6147b000..0x6147eeb0]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:129)
        at oracle.net.ns.Packet.receive(Packet.java:239)
        at oracle.net.ns.DataPacket.receive(DataPacket.java:92)
        at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:172)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:117)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:92)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:77)
        at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1023)
        at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:999)
        at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:584)
        at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:183)
        at oracle.jdbc.driver.T4CStatement.fetch(T4CStatement.java:1000)
        at oracle.jdbc.driver.OracleResultSetImpl.close_or_fetch_from_next(OracleResultSetImpl.java:314)
        - locked <0x774546e0> (a oracle.jdbc.driver.T4CConnection)
        at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:228)
        - locked <0x774546e0> (a oracle.jdbc.driver.T4CConnection)
        at weblogic.jdbc.wrapper.ResultSet_oracle_jdbc_driver_OracleResultSetImpl.next(Unknown Source)

Бит, начиная с weblogic.work.ExecuteThread.run, здесь опущен. У нас есть 8 наборов дампов потоков - и каждый показывает поток, ожидающий на одной и той же строке, и один и тот же объект заблокирован

at oracle.jdbc.driver.OracleResultSetImpl.close_or_fetch_from_next(OracleResultSetImpl.java:314)
        - locked <0x774546e0> (a oracle.jdbc.driver.T4CConnection)

Ответы [ 2 ]

5 голосов
/ 19 апреля 2013

если вы используете флаг отладки weblogic -Dweblogic.debug.DebugJDBCSQL, вы сможете отследить SQL, который фактически выполняется

5 голосов
/ 22 декабря 2010

Во время печати стека он, кажется, заблокирован в ожидании большего количества данных с сервера

at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:228)

Возможно, это просто запрос, который принимает более StuckThreadMaxTime, и WL выдает предупреждение.

Если возможно, я бы попробовал:

  • Найти, какой запрос или запросы зависают, и проверить время выполнения
  • Использовать Wireshark для анализа связи с базой данных
  • Взгляните на исходный код драйвера (на ум приходит JD), чтобы понять трассировку стека
...