最近碰上一个问题,因为druid在解析我们的表结构的时候总是报错,无法通过。所以关掉了druid的ddl以及canal query ddl的识别。如果此时更新了业务表的列,例如增加列。在新的event来的时候,会发生,event里的fields数量多,而tableMeta里的列数少,而抛出异常。
` public TableMeta getTableMeta(String schema, String table, boolean useCache, EntryPosition position) { TableMeta tableMeta = null; if (tableMetaTSDB != null) { //TODO 觉得此处应该加上useCache判断,如果使用了cache,从缓存走。如果不使用cache,就走数据库直连查询 tableMeta = tableMetaTSDB.find(schema, table); if (tableMeta == null) { // 因为条件变化,可能第一次的tableMeta没取到,需要从db获取一次,并记录到snapshot中 String fullName = getFullName(schema, table); try { ResultSetPacket packet = connection.query("show create table " + fullName); String createDDL = null; if (packet.getFieldValues().size() > 0) { createDDL = packet.getFieldValues().get(1); } // 强制覆盖掉内存值 tableMetaTSDB.apply(position, schema, createDDL, "first"); tableMeta = tableMetaTSDB.find(schema, table); } catch (IOException e) { throw new CanalParseException("fetch failed by table meta:" + fullName, e); } } return tableMeta; } else { if (!useCache) { tableMetaDB.invalidate(getFullName(schema, table)); }
return tableMetaDB.getUnchecked(getFullName(schema, table));
}
}`
原提问者GitHub用户wzh3839188
你关掉了tsdb,就没法解决这个列不匹配的问题。如果针对DDL无法解析,建议反馈对应的DDL,推动TSDB的完善
原回答者GitHub用户agapple
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。