alibaba / canal

阿里巴巴 MySQL binlog 增量订阅&消费组件
Apache License 2.0
28.44k stars 7.6k forks source link

一对多 update 更新失败 #2374

Open csx-bill opened 4 years ago

csx-bill commented 4 years ago

2019-11-07 20:34:57.309 [pool-3-thread-1] ERROR c.a.o.canal.adapter.launcher.loa der.CanalAdapterWorker - java.util.NoSuchElementException java.lang.RuntimeException: java.util.NoSuchElementException at com.alibaba.otter.canal.client.adapter.es.service.ESSyncService.sync( ESSyncService.java:110) at com.alibaba.otter.canal.client.adapter.es.service.ESSyncService.sync( ESSyncService.java:58) at com.alibaba.otter.canal.client.adapter.es.ESAdapter.sync(ESAdapter.ja va:169) at com.alibaba.otter.canal.client.adapter.es.ESAdapter.sync(ESAdapter.ja va:148) at com.alibaba.otter.canal.adapter.launcher.loader.AbstractCanalAdapterW orker.batchSync(AbstractCanalAdapterWorker.java:201) at com.alibaba.otter.canal.adapter.launcher.loader.AbstractCanalAdapterW orker.lambda$null$1(AbstractCanalAdapterWorker.java:62) at java.util.ArrayList.forEach(Unknown Source) at com.alibaba.otter.canal.adapter.launcher.loader.AbstractCanalAdapterW orker.lambda$null$2(AbstractCanalAdapterWorker.java:58) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.util.NoSuchElementException: null at java.util.ArrayList$Itr.next(Unknown Source) at com.alibaba.otter.canal.client.adapter.es.support.ESTemplate.getESDat aFromDmlData(ESTemplate.java:407) at com.alibaba.otter.canal.client.adapter.es.service.ESSyncService.singl eTableSimpleFiledUpdate(ESSyncService.java:793) at com.alibaba.otter.canal.client.adapter.es.service.ESSyncService.updat e(ESSyncService.java:260) at com.alibaba.otter.canal.client.adapter.es.service.ESSyncService.sync( ESSyncService.java:95) ... 11 common frames omitted 2019-11-07 20:34:57.317 [Thread-4] ERROR c.a.o.canal.adapter.launcher.loader.Can alAdapterWorker - Outer adapter sync failed! Error sync but ACK!

CoderLiuyang commented 4 years ago

我今天也遇到这个问题了,需要大佬解决一下

CoderLiuyang commented 4 years ago

2019-11-07 20:34:57.309 [pool-3-thread-1] ERROR c.a.o.canal.adapter.launcher.loa der.CanalAdapterWorker - java.util.NoSuchElementException java.lang.RuntimeException: java.util.NoSuchElementException at com.alibaba.otter.canal.client.adapter.es.service.ESSyncService.sync( ESSyncService.java:110) at com.alibaba.otter.canal.client.adapter.es.service.ESSyncService.sync( ESSyncService.java:58) at com.alibaba.otter.canal.client.adapter.es.ESAdapter.sync(ESAdapter.ja va:169) at com.alibaba.otter.canal.client.adapter.es.ESAdapter.sync(ESAdapter.ja va:148) at com.alibaba.otter.canal.adapter.launcher.loader.AbstractCanalAdapterW orker.batchSync(AbstractCanalAdapterWorker.java:201) at com.alibaba.otter.canal.adapter.launcher.loader.AbstractCanalAdapterW orker.lambda$null$1(AbstractCanalAdapterWorker.java:62) at java.util.ArrayList.forEach(Unknown Source) at com.alibaba.otter.canal.adapter.launcher.loader.AbstractCanalAdapterW orker.lambda$null$2(AbstractCanalAdapterWorker.java:58) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.util.NoSuchElementException: null at java.util.ArrayList$Itr.next(Unknown Source) at com.alibaba.otter.canal.client.adapter.es.support.ESTemplate.getESDat aFromDmlData(ESTemplate.java:407) at com.alibaba.otter.canal.client.adapter.es.service.ESSyncService.singl eTableSimpleFiledUpdate(ESSyncService.java:793) at com.alibaba.otter.canal.client.adapter.es.service.ESSyncService.updat e(ESSyncService.java:260) at com.alibaba.otter.canal.client.adapter.es.service.ESSyncService.sync( ESSyncService.java:95) ... 11 common frames omitted 2019-11-07 20:34:57.317 [Thread-4] ERROR c.a.o.canal.adapter.launcher.loader.Can alAdapterWorker - Outer adapter sync failed! Error sync but ACK!

我之前也遇到这个问题了发现sql语句中有一个是 null as xxx的字段,你检查下你的sql ,我也是一个一个连表一个个试的

yilongchuan commented 3 years ago

null as xxx的字段为什么需要报错?

zhyank commented 1 year ago

保错行代码

  String columnName = fieldItem.getColumnItems().iterator().next().getColumnName();

异常原因是常量无法被解析成表字段, fieldItem.getColumnItems() 此时是长度为0的列表,改成 if(col^col, null, null) as xx, col 为表中任意非空字段即可