MySQL connector Java 最近的一些变更
前段时间看sharidng-sphere项目,里面引用了MySQL的Java连接库MySQL-connector-java,用的是5.1.42,但是由于我个人的测试库是MySQL 8.0,用5.1.42版本的jdbc连接的时候,遇到一些兼容性问题(密码算法,会话变量等),于是就想要用MySQL-connector版本的最新版本8.0.13代替下,没想到却打开了一个潘多拉的盒子,事后我追踪了一下MySQL JDBC对MySQL 8.x的支持变更,记录在此作为备忘.
MySQL Connector java的版本
首先说一下MySQL的JDBC库的版本,目前主流使用的,是5.1.x系列版本,这个版本从2015年出现到现在,一直有在被维护(期间有过一个6.x版本,但并没有继续维护),而8.x是新出的版本,2018年4月份才第一个GA版本,5.1.x与8.x系列是目前在并行维护的两个JDBC版本.
5.1.x的变化
连接到8.x,尤其是升级模式的,推荐是更新到5.1.x的最新版本 query_cache_size会话变量在8.x已经废弃,但5.1.43之前的版本中,jdbc还在继续查这个变量,导致jdbc连接数据库会失败. tx_isolation 与 tx_read_only 变量已经变成 transaction_isolation 与 transaction_read_only ,5.1.44开始兼容 TLS(SSL连接)的版本,在之前的JDBC实现仅兼容到1.1版本,但8.0.4要求的版本是1.2版本,在5.1.46版本进行了兼容 5.1.46开始,支持caching_sha2_password的密码认证,这个是8.0的默认密码策略 5.1.47开始,utf8的jdbc配置默认映射为utf8mb4(之前的版本要求设置character_set_server=utf8mb4才会进行这个映射).
8.x的变化
8.x的设计基础是Java 8版本,而目前的主流Java开发版本和平台还是1.7,而java的最新版本目前是11,就我个人的尝试来看,经常会遇到某个老库的包兼容性有问题.甚至包括maven的编译组件.
细化到MySQL JDBC 8.x的变更,也是如此.我挑拣出来一些我认为重大的变更记录在此,预防踩坑.
连接基础类名,java.sql.Driver的路径,从com.mysql.jdbc.Driver 变化到 com.mysql.cj.jdbc.Driver. ;数据源java.sql.DataSource的基础类名,从com.mysql.jdbc.jdbc2.optional.MysqlDataSource变化为com.mysql.cj.jdbc.MysqlDataSource
这俩配置的变更,最麻烦的问题在于,很多代码里面,这种都是直接作为字符串写在代码中,而非单独的配置项目,不像jdbc连接串可以直接替换配置文件修改.
实际上几乎所有的JDBC接口实现的具体类路径都变了,如果是对MySQL JDBC实现重度依赖的框架,估计会有不少麻烦.
虽然8.x的JDBC是目前的推荐使用版本,但就目前的变更来看,估计升级会是一个漫长的道路,
sharding-sphere的变更
以我在sharidng-sphere的修改兼容来看,主要是以下一些地方:
- 首先是jdbc驱动路径,sharidng-sphere是写在代码里面的,需要做成单独的配置项目.
- 测试case的兼容处理. 这部分相对麻烦些,因为测试的时候,很多地方使用了绝对路径引用,用反射可以搞定,纯粹是工作量问题,但是遇到个问题,分布式框架atomikos的测试case还是有些问题,忽略掉的话,其他case都是可以成功的,具体原因还需要再看,