Mysql Jdbc读取datetime类型字段返回LocalDateTime类,而不是Timestamp

问题描述

今天更改了一些依赖的版本,项目原来正常的功能忽然不正常了,报出以下异常:

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的源码。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值