Нереагирующая тема в Tomcat - PullRequest
       18

Нереагирующая тема в Tomcat

0 голосов
/ 06 августа 2009

Конверт: Tomcat 5.x на Java 1.5.x на Windows с использованием драйвера OracleJDBC на Oracle 9i

Проблема: У меня есть поток, который находится в состоянии RUNNABLE. Кажется, он не завершен никогда.

Как мне исследовать это дальше? Это легко воспроизвести.

Этот поток в основном пытается вставить некоторые данные

Обновление: эта вставка происходит в синхронизированном блоке

Это то, что я получил из дампа потока . .

"http-9080-Processor24" daemon prio=6 tid=0x0b20bc00 nid=0x1274 runnable [0x0d55e000..0x0d55fc94]
java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at oracle.net.ns.Packet.receive(Unknown Source)
    at oracle.net.ns.DataPacket.receive(Unknown Source)
    at oracle.net.ns.NetInputStream.getNextPacket(Unknown Source)
    at oracle.net.ns.NetInputStream.read(Unknown Source)
    at oracle.net.ns.NetInputStream.read(Unknown Source)
    at oracle.net.ns.NetInputStream.read(Unknown Source)
    at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1099)
    at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1070)
    at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:478)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
    at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:955)
    at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10580)
    - locked <0x02c10078> (a oracle.jdbc.driver.T4CPreparedStatement)
    - locked <0x03dceb08> (a oracle.jdbc.driver.T4CConnection)
    at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:294)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)

Ответы [ 3 ]

2 голосов
/ 06 августа 2009

Похоже, что ваше приложение выполняет oracle.jdbc.driver.OraclePreparedStatement.executeBatch(), которое, кажется, ожидает (навсегда?) NetInputStream, чтобы фактически вернуть что-то.

Итак, возможно ли, что выполняемый запрос / оператор никогда не вернется? Возможно ли, что ваша база данных зависает? Или, возможно, вы столкнулись с какой-то ошибкой в ​​драйвере Oracle JDBC - у вас самая последняя версия?

Вероятно, вам также следует проверить, позволяет ли ваш драйвер JDBC указывать конфигурации для тайм-аутов подключения / запроса и т. Д., Чтобы драйвер не ожидал вечно.

0 голосов
/ 06 августа 2009

Одна из причин, по которой оператор пакета может не вернуться, связана с блокировками таблицы, которые удерживаются, поскольку изменения не были должным образом зафиксированы предыдущими запущенными запросами.

Если это так - вы должны просмотреть код, в котором были установлены все autoCommit (true) / autoCommit (false) и если откат использовался в предложениях обработки исключений, и зафиксировать в противном случае.

Вы также можете проверить дамп профиля из инструмента Visual VM - это удобно при тестировании работающего приложения в среде разработки. Это дает полную информацию о выполнении вызова метода.

0 голосов
/ 06 августа 2009

RN:

Если у вас есть файл дампа ядра Java, пытались ли вы использовать HPROF tools из Java SE 5? Я обычно использовал этот инструмент как простой способ выяснить, где проблема была в исходных кодах. Если это не поможет, я, вероятно, буду использовать инструмент профилирования . Пожалуйста, поправьте меня, если это не так по вашему вопросу.

Надеюсь, это поможет.

Tiger.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...