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

Java 不存在行上的Oracle/OJDBC BLOB更新问题?,java,oracle,blob,prepared-statement,Java,Oracle,Blob,Prepared Statement,我在Oracle中遇到了一个非常奇怪的问题。我正在使用OracleXE 10g(数据库的10.2.0.1.0版本),并使用ojdbc14_g驱动程序版本10.2.0.1.0、10.2.0.4.0和10.2.0.5.0进行了尝试。同样的事情总是发生。我认为这是基于我目前在各种论坛上读到的驱动程序,但我不确定。。。这就是问题所在: 我有一段代码,它准备语句来更新两个blob,它们实际上是zip存档: File fRst = new File("archive1.zip"); File fPro =

我在Oracle中遇到了一个非常奇怪的问题。我正在使用OracleXE 10g(数据库的10.2.0.1.0版本),并使用ojdbc14_g驱动程序版本10.2.0.1.0、10.2.0.4.0和10.2.0.5.0进行了尝试。同样的事情总是发生。我认为这是基于我目前在各种论坛上读到的驱动程序,但我不确定。。。这就是问题所在:

我有一段代码,它准备语句来更新两个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),则第行:

返回0行已更新,考虑到WHERE子句中定义的行不存在,这是预期的。但是,如果zip文件稍大(3040KB),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)

这些异常有效地杀死了底层套接字连接,因此它变得不可用。 有趣的是,如果表中存在行,则一切正常,更新执行时没有问题,更新行数返回1

我想知道是否有人已经遇到了这种奇怪的行为,是否有任何旁路?(除了明显的一个-检查行是否存在:))


谢谢。

java.sql.SQLException:不再从套接字读取数据

每当我看到这一点时,都是因为您所连接的oracle服务器崩溃(而不是实例)


发生这种情况时,您是否检查了警报日志?

java.sql.SQLException:没有更多数据可从套接字读取

每当我看到这一点时,都是因为您所连接的oracle服务器崩溃(而不是实例)


发生这种情况时,您是否检查了警报日志?

可能是专用进程崩溃了,不是服务器。@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],[],[],[],[],[],[]之后似乎没有日志。。。过了一段时间,我重新启动了db服务器,这就是nex线路(2小时后?):Thu Sep 01 12:57:50 2011关闭实例:进一步登录禁用Doops-似乎又是一个Oracle错误。准备好熟悉OPatch,或升级到下一版本的“工业实力”RDBMS或更好的RDBMS,如果可以,请使用其他RDBMS。看起来甲骨文公司最近投资最多的是针对竞争对手的诉讼……是的,如果你得到了ORA-600,那么是时候向甲骨文提出SR了。可能是专用流程崩溃了,不是服务器。@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],[],[],[],[],[],[]之后似乎没有日志。。。过了一段时间,我重新启动了db服务器,这就是nex线路(2小时后?):Thu Sep 01 12:57:50 2011关闭实例:进一步登录禁用Doops-似乎又是一个Oracle错误。准备好熟悉OPatch,或升级到下一版本的“工业实力”RDBMS或更好的RDBMS,如果可以,请使用其他RDBMS。看起来甲骨文公司最近投资最多的是针对竞争对手的诉讼……是的,如果你得到了ORA-600,那么是时候向甲骨文提出SR了。在JDK 1.6中,你应该使用ojdbc6.jar(而不是ojdbc14.jar)。@Codo好的,我会试试,但ojdbc6是针对甲骨文11g的,我使用的是10g。你知道它是向后兼容的吗?您试过了吗?不同的驱动程序(ojdbcxxx.jar和OCI.dll)或多或少是向前和向后兼容的。但只有测试才能显示它在您的情况下是否有效。在Oracle10g中使用ojdbc6应该不会比在JDK6中使用ojdbc14更糟糕。在JDK1.6中,您应该使用ojdbc6.jar(而不是ojdbc14.jar)。@Codo好的,我会试试,但ojdbc6是用于Oracle11g的,我使用的是10g。你知道它是向后兼容的吗?您试过了吗?不同的驱动程序(ojdbcxxx.jar和OCI.dll)或多或少是向前和向后兼容的。但只有测试才能显示它在您的情况下是否有效。在Oracle10g中使用ojdbc6不应该比在JDK6中使用ojdbc14更糟糕。
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