Oracle/OJDBC在不存在行上的BLOB更新问题?

问题描述:

我在Oracle中遇到了非常奇怪的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更新问题?

我有这段代码,准备语句更新两个Blob,这实际上是zip档案:

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或10KB),行:

int no = pstmt.executeUpdate(); 

返回0行更新,预计考虑WHERE子句不存在定义的行。然而,如果压缩文件是大一点(30,40KB),的executeUpdate()抛出的SQLException与各种消息,如:

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,你应该使用ojdbc6.jar(而不是ojdbc14.jar)。 – Codo

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

每当我看到这一点,因为它的Oracle服务器你连接到已崩溃(而不是实例)。

你是否检查过你的提醒日志?

+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

似乎没有登录后...然后我重新启动数据库服务器一段时间后,这是非常nex线(2小时后?):Thu Sep 01 12:57:50 2011 关闭实例:进一步登录被禁用 – Less