Оператор слияния Derby приводит к ошибке "Недостаточно данных при чтении из сети"

У нас есть приложение (Apache Cocoon), которое хранит и извлекает данные в базе данных Apache Derby. Derby работает в режиме сервера, версия 10.12.1.1.

Запросы, вставки и обновления выполняются без проблем, но когда выполняется оператор слияния, мы получаем сообщение об ошибке "Недостаточно данных при чтении из сети - ожидается минимум 21 272 байта и получено только 0 байтов. Соединение было разорвано."

Информация в журнале Derby.

Wed Jan 11 12:27:52 CET 2017 Thread[DRDAConnThread_5,5,main] (DATABASE = /appl2/derby/STEAD1_B2B_SCHEMA), (DRDAID = ��������.����-4326268907908754457{5}), Execution failed because of Permanent Agent Error: SVRCOD = 40; RDBNAM = /appl2/derby/STEAD1_B2B_SCHEMA; diagnostic msg = null
Wed Jan 11 12:27:52 CET 2017 : Execution failed because of Permanent Agent Error: SVRCOD = 40; RDBNAM = /appl2/derby/STEAD1_B2B_SCHEMA; diagnostic msg = null org.apache.derby.impl.drda.DRDAProtocolException: Execution failed because of Permanent Agent Error: SVRCOD = 40; RDBNAM = /appl2/derby/STEAD1_B2B_SCHEMA; diagnostic msg = null at org.apache.derby.impl.drda.DRDAProtocolException.newAgentError(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.sendUnexpectedException(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.handleException(Unknown Source) at org.apache.derby.impl.drda.DRDAConnThread.run(Unknown Source)

Wed Jan 11 12:27:52 CET 2017 : null 
java.lang.NullPointerException
at org.apache.derby.impl.drda.DDMWriter.maxEncodedLength(Unknown Source)
at org.apache.derby.impl.drda.DDMWriter.writeString(Unknown Source)
at org.apache.derby.impl.drda.DRDAConnThread.writeSQLCAGRP(Unknown Source)
at org.apache.derby.impl.drda.DRDAConnThread.writeSQLCARD(Unknown Source)
at org.apache.derby.impl.drda.DRDAConnThread.writeSQLCARDs(Unknown Source)
at org.apache.derby.impl.drda.DRDAConnThread.processCommands(Unknown Source)
at org.apache.derby.impl.drda.DRDAConnThread.run(Unknown Source)

SQL-оператор слияния:

merge into octl as trg
using octl_external as src
on (    trg.content_type = src.content_type
    and trg.distr_channel= src.distr_channel
    and trg.object_id    = src.object_id
    and trg.localisation = src.locale
    and trg.type         = src.type
    )
when not matched then
   insert ( content_type, distr_channel, object_id, localisation, type, masterlastmodified_ts, lastmodified_ts)
   values ( src.content_type, src.distr_channel, src.object_id, src.locale, src.type, src.lastmodified_ts, src.lastmodified_ts)
when matched then
   update set trg.masterlastmodified_ts = src.lastmodified_ts
            , trg.lastmodified_ts =  src.lastmodified_ts

Этот оператор слияния был протестирован в sql-console в Squirrel и работает нормально.

Резюме: другие sql-операторы отлично работают из Cocoon, оператор merge отлично работает в Squirrel, но не из Cocoon.

Что может быть причиной такого поведения?

1 ответ

Для интересующихся мы нашли два обходных пути:

  1. передача оператора слияния хранимой процедуре Java в Derby, которая выполняет оператор слияния.
  2. замена оператора слияния оператором вставки, где не существует и оператором обновления, где существует.

Мы выбрали первый подход, поскольку он более компактен и выполняется быстрее.

Другие вопросы по тегам