2015-07-28 9 views
6

Abbiamo un'applicazione java che comunica con Oracle 11.2 utilizzando jdbc. Stiamo utilizzando Oracle JDBC-7.jarResultSet.next() bloccato durante la conversazione con Oracle 11.2 utilizzando jdbc

Created-By: 20.12-b01 (Sun Microsystems Inc.) 
Implementation-Vendor: Oracle Corporation 
Implementation-Title: JDBC 
Implementation-Version: 12.1.0.1.0 

Inoltre stiamo usando Statement.setQueryTimeout()

Tuttavia, ogni pochi giorni, il filo a parlare con Oracle si blocca mentre si fa un ResultSet.next() .

codice simile a questo:

PreparedStatement ps = createPreparedStatement(); 
ps.setQueryTimeout(60); 

while (true) { 
    ps.executeQuery(); 

    //iterate over the ResultSet doing ResultSet.next() continuously 

    //do something with the ResultSet 

    //sleep for 1 second. 
} 

Threaddump:

java.lang.Thread.State: RUNNABLE 
at java.net.SocketInputStream.socketRead0(Native Method) 
at java.net.SocketInputStream.read(SocketInputStream.java:152) 
at java.net.SocketInputStream.read(SocketInputStream.java:122) 
at oracle.net.ns.Packet.receive(Packet.java:311) 
at oracle.net.ns.DataPacket.receive(DataPacket.java:105) 
at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:305) 
at oracle.net.ns.NetInputStream.read(NetInputStream.java:249) 
at oracle.net.ns.NetInputStream.read(NetInputStream.java:171) 
at oracle.net.ns.NetInputStream.read(NetInputStream.java:89) 
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:123) 
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:79) 
at oracle.jdbc.driver.T4CMAREngineStream.unmarshalUB1(T4CMAREngineStream.java:426) 
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:390) 
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249) 
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:566) 
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:215) 
at oracle.jdbc.driver.T4CPreparedStatement.fetch(T4CPreparedStatement.java:1022) 
at oracle.jdbc.driver.OracleStatement.fetchMoreRows(OracleStatement.java:3590) 
at oracle.jdbc.driver.InsensitiveScrollableResultSet.fetchMoreRows(InsensitiveScrollableResultSet.java:1008) 
at oracle.jdbc.driver.InsensitiveScrollableResultSet.absoluteInternal(InsensitiveScrollableResultSet.java:972) 
at oracle.jdbc.driver.InsensitiveScrollableResultSet.next(InsensitiveScrollableResultSet.java:572) 
- locked <0x00000000d0873738> (a oracle.jdbc.driver.T4CConnection) 

Tutte le idee su come risolvere questo sarebbe apprezzato?

Abbiamo provato a utilizzare openjdk7 e oracle JDK 7 ma non è stato di aiuto.

Grazie.

+0

È molto difficile dare suggerimenti basati su uno stacktrace da solo. Pubblicare il codice Java che crea il 'ResultSet' (e la query) potrebbe aiutare a risolvere il problema. –

+1

[Risolvere i problemi relativi a Oracle-hung] (http://stackoverflow.com/questions/11673947/troubleshoot-oracle-hung-process) potrebbe essere correlato - lo stesso errore 'bloccato <...> (un oracle.jdbc.driver.T4CConnection) 'appare nella traccia dello stack. –

+0

@MickMnemonic Penso che il tuo commento sia migliore della mia risposta. – plkmthr

risposta

1

Cercare di trovare la sessione di blocco.

SELECT 
    s.blocking_session, 
    s.sid, 
    s.serial#, 
    s.seconds_in_wait 
FROM 
    v$session s 
WHERE 
    blocking_session IS NOT NULL 

Se è la sessione, la query potrebbe richiedere l'ottimizzazione. Altrimenti qualcos'altro sta causando il problema.

P.S. : Non sono esperto SQL

Problemi correlati