Проблема обновления Oracle / OJDBC BLOB для несуществующих строк? - PullRequest
0 голосов
/ 01 сентября 2011

Я столкнулся с очень специфической проблемой с BLOB в 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.То же самое происходит всегда.Я думаю, что это что-то с драйверами, основанными на том, что я читал на различных форумах, но я не уверен ... И это проблема:

У меня есть этот кусок кода, который готовит операторобновить два больших двоичных объекта, которые на самом деле являются 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 или 10 КБ), строка:

int no = pstmt.executeUpdate();

возвращает 0 обновленных строк, что ожидается, учитывая, что строки, определенной в предложении WHERE, не существует.Однако, если zip-файлы немного больше (30, 40 КБ), 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 как количество обновленных строк.

Интересно, кто-нибудь уже сталкивался с этим?странное поведение, и есть ли обходной путь для этого?(кроме очевидного - проверить, существует ли строка :))

Спасибо.

1 Ответ

3 голосов
/ 01 сентября 2011

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

Всякий раз, когда я видел это, это происходит из-за сбоя сервера оракула, к которому вы подключены (не экземпляр).

Проверяли ли вы свой журнал предупреждений во время этогопроисходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...