对比5.1.48VS8.0.16版本 getConnection、isValid

  • 一、驱动以及目录结构
    • 1.1 驱动对比
    • 1.2 目录结构对比
  • 二 getConnection流程对比
    • 2.1 5.1.48版本getConnection
    • 2.2、8.0.16版本的getConnection流程
  • 三、isValid 流程对比
  • 四、升级遇到的坑
    • 4.1 SQL String cannot be empty
      • Error updating database. Cause: java.sql.SQLException: SQL String cannot be empty
    • 4.2 Date 类型 问题
    • 4.3 timestamp、datetime类型
  • 五、对比总结
    • 5.1 getConnection 小结
    • 5.2 其他对比

一、驱动以及目录结构

官网地址:https://dev.mysql.com/doc/relnotes/connector-j/8.0/en/

1.1 驱动对比

5.1.48 引入驱动时名称为:com.mysql.jdbc.Driver

8.0.16 引入驱动时名称为:com.mysql.cj.jdbc.Driver ,如果 驱动还配置 5.x 的版本,也没有问题,只是会如下提示:

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.


但是还是会自动 切换成 新的驱动,原因如下,主要是做了代码兼容,让原先的Driver继承了com.mysql.cj.jdbc.Driver ,然后在

然后com.mysql.cj.jdbc.driver 里面的 静态块 进行注册:

public class Driver extends NonRegisteringDriver implements java.sql.Driver {//// Register ourselves with the DriverManager//static {try {java.sql.DriverManager.registerDriver(new Driver());} catch (SQLException E) {throw new RuntimeException("Can't register driver!");}}
}

在DriverManager 类里面的 通过了SPI 进行了注册和初始化:

/*** Load the initial JDBC drivers by checking the System property* jdbc.properties and then use the {@code ServiceLoader} mechanism*/static {loadInitialDrivers();println("JDBC DriverManager initialized");}

1.2 目录结构对比

5.1.X的源码目录结构和 8.0.16 的代码结构也有很大的变化,这里就不贴图了,感兴趣的自己去下载源码看,源码地址:gitHub地址
这里对比一下 对JDK 的要求:

此外,JDBC 版本和 JDK 对应的关系如下:

一、JDBC 1.0 随JDK1.1发布;
二、JDBC 2.0 随JDK1.2 和 JDK1.3 发布
JDBC 2.0 和 JDBC 2.1 API 被分入两个包:
java.sql 包(包括核心 API;它是 JDBC 1.22 API 的增强)
javax.sql 包(可选的包,用于支持连接池、分布式事务及其他类似的高级功能)。
三、JDBC3.0 随JDK1.4发布
四、JDBC 4.0 随 JDK1.6 发布
五、JDBC4.1 随 JDK1.7 发布
六、JDBC4.2 随 JDK1.8 发布

二 getConnection流程对比

这里主要是分析的正常流程:

2.1 5.1.48版本getConnection


大致流程:

  1. 判断url 是否为空,为空泽抛出异常
  2. 判断url 是否以"jdbc:mysql:loadbalance://" 开头,是则创建对应的负载均衡的connet,否则继续步骤3
  3. 判断url是否以“jdbc:mysql:replication://” 开头,是泽创建对应的Replication
    的connect,否则继续
  4. 对URL 进行 解析,转换成Properties 以便后面使用
  5. 判断NUM_HOSTS 是否 >1 ,是 则 走connectFailover 流程,否则继续
  6. 判断是否是 jdbc4, 是支持jdbc4的,那就先 通过构造函数实例JDBC4Connection
  7. JDBC4Connection 继承了 ConnectionImpl,这里 会 createNewIO(false); 进行和mysql server进行创建connection
  8. 通过StandardSocketFactory 创建 socketFactory,使用标准的 TCP/IP sockets (the
    standard) 进行socket 连接
  9. 通过BufferedOutputStream 进行 确定,这样一个connection就创建完成.

2.2、8.0.16版本的getConnection流程


大致流程如下:

  1. 判断url 是否为空,如果为空,抛出异常
  2. 通过正则表达式验证 URL的开头是否符合规定的,这里 通过枚举列出来,5.1.48 是逐个判断,个人感觉8.0.X的 代码结构相关整洁一些,类型如下,官方给出解释,不同的数据库用错驱动比较常见,比如用的ServerSQL 的数据库,用的mysql 的驱动
  3. 对URL 进行拼接,拼接玩,用此链接作为Key,从缓存里面获取对应的ConnectionUrl 实例
  private static final LRUCache<String, ConnectionUrl> connectionUrlCache = new LRUCache<>(100);


4. 获取到了就直接返回,获取不到就 通过 Class.forName 进行构造
5. 拿到ConnectionUrl 之后,根据对应的Type 进行和 mysql Server 创建Connection
6. 先对各类参数进行初始化,然后 createNewIO(false);
7. 这里通过 TCP/IP sockets (the standard) 开始进行连接, 建立之后 ,连接的状态是
:unauthenticated user,还没去确认,等待client 端确认.
8. 这里相对 5.1.48 做了进一步的细化, 创建了一个 protocol , 明确了:物理连接仅负责 I / O流,而 protocol 负责创建 session ,以及 内部认证,protocol 对 读取和发送消息也进行了封装.,这里 protocol.connect 进行确认,正式创建连接

三、isValid 流程对比

两个版本的isValid ,都是拿到连接之后,通过socket 发送一个 a ping command给到 mysql Server ,然后读取对应的消息,如果获取到的是 java.io.EOFException ,说明此connection 已经断开,抛出异常, 两个版本的大致流程基本一样,这里就不贴对比了,直接贴一下两个的大致流程路径:

四、升级遇到的坑

4.1 SQL String cannot be empty

Error updating database. Cause: java.sql.SQLException: SQL String cannot be empty

这个是由于 原先的5.x 没有对 非空校验,只是校验了 是否为null,而8.x 多了一个校验.

4.2 Date 类型 问题

数据库里面是 Date(对应 java.sql.Date) 类型,查询的时候,传入的是 Date(java.util.Date) 类型,5.1.48 可以查询到,升级之后查询不到,主要原因是 8.X 的版本,在时间转换时加了 时区 进去,而5.x没有
解决办法: 服务器的 时区和 mysql服务器要一致

4.3 timestamp、datetime类型

在 5.1.48 的 版本里面 ,
如果 把表里的类型 为 timestamp,datetime 类型 直接转为 String 类型,后面有一个 .0 毫秒格式,如下:

2020-04-19 07:34:52.0

而在8.0.16 里面直接 转为:

2020-04-19 07:34:52

格式有细微的差别

五、对比总结

5.1 getConnection 小结

  1. 8.0.16 对整个代码的结构进行了调整, 原先 5.1.x 很多的if …else 这类分支 ,8.0.16版本 通过正则 匹配 过滤掉不符合 规范的url ,再 通过 枚举 方式 匹配对应的 情况,这样代码更加简洁, 也更加直接,不符合的url 直接返回而不需要到创建的时候才发现不符合,效率更高.

  2. 8.0.16 里面设置了一个 缓存,key 为拼接好的URL ,value 对对应的connectionUrl, 创建连接时,每次的url一样就不用每次都通过构造函数来进行创建 ,这里进行了一定的优化,创建的速度更快

  3. 在 和mysql server 进行创建 连接时,都是创建socket 连接,但8.0.16 把很多的代码进行了重新整合,引入了一个 protocol 辅助类,对一些读写 方法 都重新封装,层次更加清晰了一些,也对校验进行了一定程度的增强.

5.2 其他对比

  1. 8.0.16 依赖 JDBC 4.2 ,所以要求JDK1.8

  2. 8.0.16 版本修复了一些bug 和对一些方法进行了整合,详见:mysql-connector-java 官方描述

对比(5.1.48VS8.0.16)getConnection、isValid相关推荐

  1. mysql_upgrade --force_社区投稿 | MySQL 8.0.16 告别mysql_upgrade升级方式

    最熟悉的命令要消失了! MySQL 8.0.16 开始,MySQL 不推荐使用mysql_upgrade.取而代之的是 server upgrade的升级方式. 一.为什么变更升级方式 官方为什么这么 ...

  2. MySQL 8.0.16 告别mysql_upgrade升级方式

    作者简介:田帅萌 京东数科DBA,爱可生开源社区志愿者. 最熟悉的命令要消失了! MySQL 8.0.16 开始,MySQL 不推荐使用mysql_upgrade.取而代之的是 server upgr ...

  3. mysql_upgrade 升级_MySQL 8.0.16 告别mysql_upgrade升级方式

    原创作者: 田帅萌作者简介:田帅萌,京东数科DBA,爱可生开源社区志愿者. 最熟悉的命令要消失了! MySQL 8.0.16 开始,MySQL 不推荐使用mysql_upgrade.取而代之的是 se ...

  4. 当前记录集不支持更新_微信现已正式支持修改微信号!微信7.0.16内测版更新(附下载)...

    还记得微信安卓7.0.15内测版吗?这一版本带来了大家期待已久的深色模式独立设置功能.这不,时隔近一个月,微信安卓内测版又更新了. 最新版本号是7.0.16,更新日志显示"本次更新优化了一些 ...

  5. 开源多云技术平台——Choerodon猪齿鱼发布0.16版本

    Choerodon猪齿鱼开源多云技术平台,是基于开源技术Kubernetes,Istio,knative,Gitlab,Spring Cloud来实现本地和云端环境的集成,实现企业多云/混合云应用环境 ...

  6. Mysql8.0.16 only_full_group_by

    [1]Mysql8.0.16 关于only_full_group_by问题 应公司业务的需求,安装了Mysql8.0.16版本,原来在Mysql5.6版本执行无恙的SQL语句: SELECT prod ...

  7. mysql8安装错误_Windows安装MySQL8.0.16 的步骤及出现错误问题解决方法

    一.前言: mysql8之后想比起之前常用的版本改动还是挺大的,因为刚从安装接触,就先从基本的说起.现在的mysql8安装只能采用解压配置版,像以前老版本的傻瓜式安装将不复存在.其实mysql8了解如 ...

  8. win10安装misql8_Win10下免安装版MySQL8.0.16的安装和配置教程图解

    1.MySQL8.0.16解压 其中dada文件夹和my.ini配置文件是解压后手动加入的,如下图所示 2.新建配置文件my.ini放在D:\Free\mysql-8.0.16-winx64目录下 [ ...

  9. mysql 5.0 乱码_MySQL 5.0.16 乱码问题处理办法

    MySQL 5.0.16 乱码问题处理办法 1 设置phpMyAdmin Language:Chinese simplified (zh-utf-8) MySQL 字符集:UTF-8 Unicode ...

  10. 假设用于通信的电文由字符集{a,b,c,d,e,f,g}中的字母构成。 它们在电文中出现的频度分别为{0.31,0.16,0.10,0.08,0.11,0.20,0.04}。【MOOC答案】

    目   录 1.题目 2.答案and详细题解过程 1)为这7个字母设计哈夫曼编码: 1.1.答案 1.2.详细题解过程 2)为这7个字母设计等长编码,至少需要几位二进制数?[3位] 2.1.答案 2. ...

最新文章

  1. 2012 MUTC 7 总结
  2. 【JZOJ3236】矮人排队
  3. [转]对贡献有激情,对回报有信心
  4. 深圳内推 | 粤港澳大湾区数字经济研究院招聘NLP算法研究员(可实习)
  5. php 生成wsdl工具,php中使用zendstudio 12为soapserver生成wsdl文件
  6. android问题总结报告,Android开发中常见的问题总结
  7. 对于 APM 用户的一次真实调查分析(下)
  8. c/c++ code JSON
  9. lua 给userdata设置元表_lua学习之复习汇总篇
  10. scala中捕获异常_如何在Scala中引发异常?
  11. 仓鼠大厦java下载_仓鼠大厦食盐宫殿 世界古怪酒店TOP10(组图)
  12. IPerf——网络测试工具介绍与源码解析(3)
  13. python分数由高至低排序_python之数据库
  14. struts1、 struts2所有版本jar包下载地址大全
  15. 大智慧c语言dll,调用大智慧dll,简单支持大智慧公式dll接口
  16. [wp] HITB CTF 2017 website
  17. 软件项目风险控制-公益讲座视频,供大家学习参考。
  18. 通信原理第三章:窄带随机过程
  19. 拜拜了Unable to connect to remote host. Catalog download has failed.您嘞
  20. PCM开发板模块实验指导--SPI读写PSRAM64实验

热门文章

  1. linux中的通配符指的是?
  2. php 魔方加密还原,PHP魔方解密 - osc_80l29rkk的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. 那些年我们一起追过的ILSVRC冠军
  4. 如何优雅的对网页截取长图
  5. MATLAB计算卫星相对位置、速度和加速度
  6. 微信小程序实现垂直tab标签页的切换及动态的选中下划线移动-纵向
  7. 贴片电容耐压和额定电压
  8. 自己组装电脑后怎么装Win10系统教学
  9. PAT题集2019.6.22排名变动
  10. 极米旗舰级新品极米H5强势来袭:画质性能在线,硬核配置拉满