2017-11-06 2 views
3

Oracle SQL 테이블의 임의의 특정 레코드에 대해 업데이트 및 선택이 작동하지 않는 문제가 있습니다. 자바 JDBC 코드, 자바 컨트롤이 무한히 그 업데이트 진술 (거기에 붙어있는 응용 프로그램) 기다리고 있습니다. 나는 하단에 스택 추적 을 첨부했습니다. 이 프로그램은 몇 년 동안 아무 문제없이 실행되었습니다.Java jdbc에서 oracle sql 데이터베이스의 행을 업데이트하지 못했습니다. Java 코드가 업데이트에서 멈추었습니다.

코드 : 우리가

  1. 을 시도

    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 세션에서 업데이트 쿼리를 실행할 수 있습니다.

  2. 응용 프로그램이 붙어있어 때 우리는 관련 테이블을 확인 : V$LOCKED_OBJECT, v$LOCK, 무한히 기다릴 자바 응용 프로그램을 만드는 테이블의 기록에 락 (lock)을 찾기위한 v$session_longops, dba_blockers, v$session, dba_waiters. 그러나 우리는 아무것도 찾을 수 없었다.

  3. 응용 프로그램을 다시 시작하면 동일한 레코드 업데이트 또는 선택이 있어도 프로그램이 종료됩니다. 해당 레코드를 건너 뛰면 다른 레코드가 아무 문제없이 업데이트됩니다.

어떤 요인이 원인이됩니까?

스택 추적

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) 
+1

오류가 발생했습니다. 또한 쿼리를 호출하기 전에 strUpdQry를 출력하고 질문에 출력을 추가하십시오. – Juan

+0

응용 프로그램이 다중 스레드입니까? 해당 행과 관련된 다른 보류중인 거래가 동시에 있습니까? 트랜잭션 격리를 변경하려고 시도 했습니까? –

+0

최근에 실행 된 소프트웨어 업데이트 또는 패치가 있습니까? DB 업데이트가 oracle java 드라이버와 동기화되지 않았습니까? – Juan

답변

1

위의 문제는 해당 오라클 버전의 동시성 문제로 인해 이 (가) java 세션이 차단되는 원인입니다.

실시간으로 최신 Oracle DB 버전으로 업데이트하면 문제가 해결됩니다.

1

이 문을 실행하기 전에 objCon.isValid()를 호출해야합니다. 연결이 유효하지 않으면 새 연결을 만드십시오.

+0

그것은 연결 문제가 아닌 것처럼 보입니다. 동일한 레코드 (문제 있음)를 처리하더라도 코드가 멈추고 그 레코드를 건너 뛰고 다음 레코드를 처리하면 업데이트 및 선택이 올바르게 작동합니다. –

+0

그런 다음 드라이버를 최신 버전으로 업그레이드하는 것이 좋습니다. 예외 스택 추적에 "TTC7Protocol"이 있다는 사실은 10 년이 넘은 드라이버를 사용하고 있음을 나타냅니다. 드라이버를 업그레이드하면 문제가 해결 될 가능성이 큽니다. –

+0

당신의 제안에 따라 우리는 ojdbc6으로 업데이트했고 문제는 여전히 복제 중입니다. v $ session에 하나의 단서가 있습니다 .Bean session_id와 함께 blocking_session 열에 일부 session_id가 있습니다. 잠금을 찾을 수 없습니다. b] 새로운 스택 wrt ojdbc6을 업데이트했습니다. 해결책을 제안하십시오. –

관련 문제