2011-09-01 3 views
0

오라클의 BLOB에 매우 특이한 문제가 발생했습니다. 나는 OracleXE 10g (10.2.0.1.0 버전의 데이터베이스)를 사용 중이며 ojdbc14_g 드라이버 버전 10.2.0.1.0, 10.2.0.4.0 및 10.2.0.5.0을 사용해 보았습니다. 똑같은 일이 항상 발생합니다. 나는 다양한 포럼에서 지금까지 읽은 내용에 기반한 드라이버라고 생각합니다. 그러나 확실하지 않습니다 ... 그리고 이것이 문제입니다 :존재하지 않는 행에 Oracle/OJDBC BLOB 업데이트 문제가 있습니까?

나는이 문장을 업데이트하여 업데이트 할 준비가되어 있습니다. 표에 존재하지 않습니다 기록 을 부여 어디 업데이트의 경우 테스트를했다

File fRst = new File("archive1.zip"); 
File fPro = new File("archive2.zip"); 
//... 
statement = "UPDATE CURR_STATE" + 
        " SET ZIP_RST=?, ZIP_PRO=?" + 
        " WHERE SERIAL_NUMBER=" + "'" + serialNo + "'" + " AND" + 
        " YEAR_MONTH=" + "'" + yearMonth + "'"; 
pstmt = this.connection.prepareStatement(statement); 
FileInputStream isR = new FileInputStream(fRst); 
FileInputStream isP = new FileInputStream(fPro); 
pstmt.setBinaryStream(1, isR, (int) fRst.length()); 
pstmt.setBinaryStream(2, isP, (int) fPro.length()); 

int no = pstmt.executeUpdate(); 
System.out.println("rows: " + no); 
this.connection.commit(); 
pstmt.close(); 

: 실제로이 개 모양은 아카이브를 압축. 이 두 zip 파일의 크기가 작은 경우, 라인 (2, 5 10킬로바이트 등) : 0 행이 업데이트

int no = pstmt.executeUpdate(); 

반환 조항이 존재하지 않는 WHERE에 정의 된 행을 고려 예상된다. 그러나, 압축 파일 (30, 40킬로바이트), executeUpdate의() 같이, 다양한 메시지와 함께 예외 : SQLException를 throw 조금 더 큰 경우 :

java.sql.SQLException: Io exception: Software caused connection abort: socket write error 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:190) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:363) 
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1142) 
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1278) 
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3415) 
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3498) 

또는

java.sql.SQLException: No more data to read from socket 

또는

java.sql.SQLException: OALL8 is in an inconsistent state 

이러한 예외는 효과적으로 기본 소켓 연결을 종료하므로 사용할 수 없게됩니다. 재미있는 점은 행 이 테이블에으로 존재하면 모든 것이 정상적으로 작동하고 업데이트가 아무런 문제없이 실행되어 업데이트 된 행의 수를 1로 반환한다는 것입니다.

아무도 이미이 이상한 동작을 경험했는지 궁금합니다.이 경우 우회하는 것이 있습니까? (명백한 것을 제외하고 - 그 행이 있는지 확인하기 :))

고마워. 나는이 그 당신이 연결되어있는 오라클 서버가 추락하기 때문에 (안 인스턴스)를 본 적이 때마다

+0

어떤 JKD 버전을 사용하십니까? – Codo

+0

jdk 1.6.0._21을 사용합니다. – Less

+0

JDK 1.6에서는 ojdbc14.jar 대신 ojdbc6.jar를 사용해야합니다. – Codo

답변

3

java.sql.SQLException: No more data to read from socket

.

경고 로그를 확인 했습니까?

+0

아마도 서버가 아닌 전용 프로세스 일 것입니다. –

+0

@ matthew-watson 방금 확인한 결과 로그에 다음 오류가 발생했습니다 : Thu Sep 01 10:14:56 2011 파일 c : \ oraclexe \ app \ oracle \ admin \ xe \ udump \ xe_ora_3492.trc : ORA-00600 : 내부 오류 코드, 인수 : [12333], [254], [64], [80], [], [], [], [] – Less

+0

그 다음에 로그 ... 그러면 약간의 시간이 지난 후에 db 서버를 재시작했는데 이것이 바로 nex 라인입니다 (2 시간 후에?) : Thu Sep 01 12:57:50 2011 인스턴스 종료 : 추가 로그온이 비활성화되었습니다. – Less

관련 문제