问题描述
今天更改了一些依赖的版本,项目原来正常的功能忽然不正常了,报出以下异常:
2023-10-19 14:24:36,783 ERROR xxx.xxx.xxx [] - Error while running the command.
java.lang.ClassCastException: java.time.LocalDateTime cannot be cast to java.sql.Timestamp
问题排查
查看数据库,发现出问题的代码是:resultSet.getObject("update_time")
,该字段在mysql中是datetime类型。
原来返回的是Timestamp类型,后续在业务处理时类型强制转换没有问题,但现在返回的是LocalDateTime,返回类型变了,因此猜测是因为maven依赖版本变更导致的。
经过逐个版本对比,发现mysql-connector-java 8.0.23版本以前(不含),对datetime类型字段处理的逻辑是与timestamp类型一致的:
case TIMESTAMP:
case DATETIME:
return getTimestamp(columnIndex);
8.0.23版本以后分开处理了:
case TIMESTAMP:
return getTimestamp(columnIndex);
case DATETIME:
return getLocalDateTime(columnIndex);
结论
因此可以得出结论,使用mysql-connector-java 8.0.23及以后的版本时,datetime类型返回的是LocalDateTime类。
一些额外的信息
本次出错的原因其实是我修改了flink-sql-connector-mysql-cdc的版本,而flink-sql-connector-mysql-cdc自己把mysql-connector-java融合到了自己的代码里,而且是新旧版本的Driver都有(底层都是同一个),因此在代码里连接mysql的时候,很容易走到该依赖中的代码,而并非自己项目依赖的mysql-connector-java,因此,想弄清楚具体使用了哪个版本的mysql-connector-java,就需要查看flink-sql-connector-mysql-cdc的源码。