使用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 Server的session_track_state_change 参数有关。
当
session_track_state_change参数关闭时,服务端返回的响应包正常,getCatalog()调用结果符合预期。
当
session_track_state_change参数开启时,服务端返回的响应包中会额外增加一个SESSION_STATE_CHANGE_TRACKER字段。MariaDB JDBC驱动无法正确解析该字段,导致解析异常,最终使getCatalog()方法返回错误结果。
解决方案
尽管MariaDB JDBC的官方文档声明其与MySQL兼容,但在某些场景下(例如上文分析的 session_track_state_change 参数开启的情况),仍存在兼容性问题。
为确保连接的稳定性,建议使用MySQL官方提供的JDBC驱动连接RDS MySQL实例。
该文章对您有帮助吗?