Oracle SQL 테이블의 임의의 특정 레코드에 대해 업데이트 및 선택이 작동하지 않는 문제가 있습니다. 자바 JDBC 코드, 자바 컨트롤이 무한히 그 업데이트 진술 (거기에 붙어있는 응용 프로그램) 기다리고 있습니다. 나는 하단에 스택 추적 을 첨부했습니다. 이 프로그램은 몇 년 동안 아무 문제없이 실행되었습니다.Java jdbc에서 oracle sql 데이터베이스의 행을 업데이트하지 못했습니다. Java 코드가 업데이트에서 멈추었습니다.
코드 : 우리가
을 시도
public void updateRequestStatus(long req_id, int status){ int rowsAffected=0; Statement stmt = null; try{ stmt = objCon.createStatement(); String strUpdQry=""; '--- some java code '--- strUpdQry= "UPDATE abcrequest SET status="+status+" where request_id="+req_id; this.logger.printString("Before executing Update Query :: with status: "+status+", Request id: "+req_id); rowsAffected=stmt.executeUpdate(strUpdQry); this.logger.printString("After executing Update Query:: "+status+", Request id: "+req_id); this.objCon.commit(); }catch(SQLException sqle){ this.lg.error("SQLException at :",sqle); this.logger.printString("SQLException occured "+sqle.getMessage()); }catch(Exception e){ this.lg.error("Exception :",e); this.logger.printString("Exception occured in: "+e.getMessage()); } finally{ closeStatement(stmt); } }
것들 우리는 같은 기록에 오라클 SQLDeveloper 세션에서 업데이트 쿼리를 실행할 수 있습니다.
- 응용 프로그램이 붙어있어 때 우리는 관련 테이블을 확인 :
V$LOCKED_OBJECT
,v$LOCK
, 무한히 기다릴 자바 응용 프로그램을 만드는 테이블의 기록에 락 (lock)을 찾기위한v$session_longops
,dba_blockers
,v$session
,dba_waiters
. 그러나 우리는 아무것도 찾을 수 없었다. 응용 프로그램을 다시 시작하면 동일한 레코드 업데이트 또는 선택이 있어도 프로그램이 종료됩니다. 해당 레코드를 건너 뛰면 다른 레코드가 아무 문제없이 업데이트됩니다.
어떤 요인이 원인이됩니까?
스택 추적
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at oracle.net.ns.Packet.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.ttc7.MAREngine.unmarshalUB1(MAREngine.java:931)
at oracle.jdbc.ttc7.MAREngine.unmarshalSB1(MAREngine.java:893)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:369)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1891)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteDescribe(TTC7Protocol.java:830)
- locked <0x09c62c78> (a oracle.jdbc.ttc7.TTC7Protocol)
at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:2391)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2672)
at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:572)
- locked <0x04b068d8> (a oracle.jdbc.driver.OracleStatement)
- locked <0x09c35338> (a oracle.jdbc.driver.OracleConnection)
at xxxxx.DBActions.xxxxx.getRequestAttributes(Unknown Source)
편집-1 : ojdbc6에 대한 추가 새로운 스택 추적. 이 문제는 연결이 내부적으로 분리 된 것처럼 보이기 때문에
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at oracle.net.ns.Packet.receive(Packet.java:282)
at oracle.net.ns.DataPacket.receive(DataPacket.java:103)
at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:230)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:175)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:100)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:85)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:122)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:78)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1179)
at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1155)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:279)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:194)
at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:1000)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1307)
at oracle.jdbc.driver.OracleStatement.executeUpdateInternal(OracleStatement.java:1814)
at oracle.jdbc.driver.OracleStatement.executeUpdate(OracleStatement.java:1779)
- locked <0x09ec40f0> (a oracle.jdbc.driver.T4CConnection)
at oracle.jdbc.driver.OracleStatementWrapper.executeUpdate(OracleStatementWrapper.java:277)
at cas.com.database.MQDatabaseDts.updateProvRequestStatus(MQDatabaseDts.java:595)
at cas.com.thread.NeoMQSenderThread.run(NeoMQSenderThread.java:188)
at java.lang.Thread.run(Unknown Source)
오류가 발생했습니다. 또한 쿼리를 호출하기 전에 strUpdQry를 출력하고 질문에 출력을 추가하십시오. – Juan
응용 프로그램이 다중 스레드입니까? 해당 행과 관련된 다른 보류중인 거래가 동시에 있습니까? 트랜잭션 격리를 변경하려고 시도 했습니까? –
최근에 실행 된 소프트웨어 업데이트 또는 패치가 있습니까? DB 업데이트가 oracle java 드라이버와 동기화되지 않았습니까? – Juan