MariaDB JDBC连接RDS时调用JDBC函数返回异常

使用MariaDB JDBC连接RDS MySQL实例,调用JDBC函数,返回异常。

问题现象

getCatalog()为例,当使用MariaDB JDBC驱动连接RDS MySQL实例并调用该方法时,无法获取预期的数据库名称。

连接 URL 配置示例如下:

jdbc:mysql://localhost:4548/aliyunrds?permitMysqlScheme=true

调用getCatalog()的返回值并非aliyunrds

问题原因

MariaDB JDBC驱动和MySQL Server存在兼容性问题。

问题分析

以调用getCatalog()方法为例,通过分析网络抓包发现,该问题与MySQL Serversession_track_state_change 参数有关。

  • session_track_state_change参数关闭时,服务端返回的响应包正常,getCatalog()调用结果符合预期。

    image.png

  • session_track_state_change参数开启时,服务端返回的响应包中会额外增加一个SESSION_STATE_CHANGE_TRACKER字段。MariaDB JDBC驱动无法正确解析该字段,导致解析异常,最终使getCatalog()方法返回错误结果。

    image.png

解决方案

尽管MariaDB JDBC的官方文档声明其与MySQL兼容,但在某些场景下(例如上文分析的 session_track_state_change 参数开启的情况),仍存在兼容性问题。

为确保连接的稳定性,建议使用MySQL官方提供的JDBC驱动连接RDS MySQL实例。