Estoy tratando de comprender un problema que tenemos con un proceso de Java que está bloqueado. Este proceso ha estado en producción durante aproximadamente 4 meses y esta semana comenzó a colgar. Cuando miro a un vertedero de hilo del proceso de todos los temas relevantes (3) tienen pilas como la siguiente:Solucionar problemas del proceso pendiente de Oracle
"TxnParser_1" prio=6 tid=0x69bd3400 nid=0x2534 runnable [0x6aa2f000]
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(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.T4CStatement.doOall8(T4CStatement.java:207)
at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:790)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1039)
at oracle.jdbc.driver.T4CStatement.executeMaybeDescribe(T4CStatement.java:830)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1132)
at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1687)
at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1653)
- locked <0x40e22f88> (a oracle.jdbc.driver.T4CStatement)
- locked <0x28f8d398> (a oracle.jdbc.driver.T4CConnection)
at com.gcg.data.LogParsingInfo.initFromDB(LogParsingInfo.java:262)
at com.gcg.om.OmQueueEntry.initParseInfoFromDB(OmQueueEntry.java:104)
at com.gcg.om.GenericQueueEntry.run(GenericQueueEntry.java:237)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
No hay hilos en espera de bloqueos por lo que el proceso no está en punto muerto. Estos 3 hilos que están haciendo el trabajo están bloqueados esperando una respuesta de Oracle, al menos eso es lo que me parece.
Al consultar Oracle, cuando consulto v $ session, parece que una de las conexiones asociadas con estos hilos está ejecutando una consulta, aunque no puedo ver el sql.
select ... from v$session where ...;
SQL_ADDRESS SQL_HASH_VALUE SQL_ID SQL_CHILD_NUMBER SQL_EXEC_START SQL_EXEC_ID PREV_SQL_ADDR PREV_HASH_VALUE PREV_SQL_ID PREV_CHILD_NUMBER PREV_EXEC_START PREV_EXEC_ID
---------------- -------------- ------------- ---------------- -------------- ----------- ---------------- --------------- ------------- ----------------- --------------- ------------
00 0 0000000239F59EE8 1483377872 fqr8pndc6p36h 5 26-JUL-12 32080545
00 0 0000000239F59EE8 1483377872 fqr8pndc6p36h 5 26-JUL-12 32080546
0000000148CABD88 1784444892 a16hxxtp5sxyw 0000000239F59EE8 1483377872 fqr8pndc6p36h 5 26-JUL-12 32080544
select * from v$sql where sql_id = 'a16hxxtp5sxyw';
no rows selected
Mis preguntas son:
- Estoy en lo correcto en mi análisis de que el proceso se bloquea simplemente esperando una respuesta por parte de Oracle?
- ¿Qué debería estar buscando en Oracle para entender por qué este proceso está bloqueando?
Actualizado:
Basado en el comentario con respecto a mirar en DBA_WAITERS y DBA_LOCKS
select * from dba_waiters;
no rows selected
select * from dba_locks where BLOCKING_OTHERS <> 'Not Blocking';
no rows selected
Había 98 filas en dba_locks pero ya que todos son 'no bloquear' No creo que es un problema de bloqueo? El proceso en cuestión ha estado en este estado durante más de 3 horas, por lo que ya se habría detectado un punto muerto.
Soy de la teoría de que la instancia de Oracle no es "saludable", pero no sé qué mirar. Tengo una solicitud para reiniciar el servidor de Oracle, pero eso aún no se ha hecho.
Pregunta de seguimiento: ¿Es normal que v $ session contenga un sqlid que no existe en v $ sql y, en caso afirmativo, bajo qué condiciones?
"colgado" jejejejeje;] – mre
Eso es Correcto, mi proceso es más grande que tu proceso. ;) – sceaj
¿Es probable que el proceso esté haciendo alguna actualización, o solo es una consulta? Si se está actualizando, ¿alguna otra cosa podría estar bloqueando lo que sea que esté tratando de hacer? Comenzaría por ver si 'DBA_WAITERS' o' DBA_LOCKS' muestran algo interesante. –