2017-01-11 24 views
0

Apache Derbyデータベースにデータを格納および取得するアプリケーション(Apache Cocoon)があります。 Derbyはサーバー・モードで稼動していますが、バージョンは10.12.1.1です。Derby merge-statementの結果、「ネットワークからの読み取り中にデータが不十分です」エラー

クエリ、挿入、および更新は問題なく実行されますが、マージステートメントが実行されると、「ネットワークからの読み取り中にデータが不足しています - 最小で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-コンソールでテストされ、正常に動作しました。

要約:他のSQLステートメントはCocoonからうまく動作しますが、マージステートメントはリスではうまく動作しますが、Cocoonではうまく動作しません。

この現象の原因は何ですか?興味のある方のため

+0

確かにバグのようです。 mergeステートメントは、Derbyでは比較的新しいものです。最小限の自己完結型のテストケースを提供し、それをApacheのDerby開発者に報告できますか? –

答えて

0

、我々は2つの回避策が見つかりました:

  1. は は、マージ・ステートメントを実行することをダービーでのJavaストアド・プロシージャにマージ文を渡します。
  2. 挿入箇所が存在しないステートメントとupdate-where- ステートメントでmerge-statementを置き換えます。

最初のアプローチでは、よりコンパクトで高速に実行できるようになりました。

関連する問題