0

我们有一个在 Apache Derby 数据库中存储和检索数据的应用程序 (Apache Cocoon)。Derby 以服务器模式运行,版本为 10.12.1.1。

查询、插入和更新执行没有问题,但是当执行合并语句时,我们收到错误消息“从网络读取时数据不足 - 预计最少 21,272 字节,仅收到 0 字节。连接已终止。 "

德比日志中的信息。

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

此合并语句在 Squirrel 的 sql-console 中进行了测试,并且工作正常。

总结:其他 sql 语句在 Cocoon 中运行良好,merge 语句在 Squirrel 中运行良好,但在 Cocoon 中运行良好。

这种行为的原因可能是什么?

4

1 回答 1

0

对于那些感兴趣的人,我们发现了两种解决方法:

  1. 将合并语句传递给 Derby 中执行合并语句的 Java 存储过程。
  2. 用 insert-where-not-exists 语句和 update-where-exists 语句替换合并语句。

我们选择采用第一种方法,因为它更紧凑且执行速度更快。

于 2017-01-20T12:23:32.923 回答