文章目录
前言
本文讨论Connector/J 的loadbalance模块。我们先观察整个模块的大概逻辑结构和每一个大组件的作用。然后在代码层面分析对于异常的控制,这里会有两个“区分”:1)区分构造连接过程和使用连接过程;2)区分通讯异常和数据异常。最终分析此模式的实用性。
本次分析的版本为5.1.46。若通过maven下载,可添加以下依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
我们获取连接的例子如下:
Connection conn = null;
URL =“jdbc:mysql:loadbalance://ip1:port1,ip2:port2,ip3:port3/dbname”;
try{
// 注册 JDBC 驱动
Class.forName("com.mysql.jdbc.Driver");
// 打开链接
conn = DriverManager.getConnection(DB_URL,USER,PASS);
....
名词定义
Mysql:Mysql数据库管理软件
Mysql服务器:安装了Mysql数据库管理软件的服务器
调用方:调用DriverManager#getConnection命令获取连接的一方
一、Loadbalance的逻辑结构
Loadbalance模块的UML类图如下:
主要组件功能如下:
- MysqlIO:负责与Mysql服务器建立tcp链接。
- ConnectionImpl、JDBC4Connection:通过MysqlIO控制与Mysql服务器间的连接,并设定和记录各种连接时间
- MultiHostMySQLConnection、LoadBalancedMySQLConnection、JDBC4LoadBalancedMySQLConnection:通过代理对象LoadBalancedConnectionProxy获取JDBC4Connection对象,并调用JDBC4Connection对象对应的接口方法(从JDBC4MySQLConnection到java.sql.Connection声明的方法),或者调用LoadBalancedConnectionProxy对应的方法。
- BalanceStrategy接口以及其实现类,以各自的算法返回合适的连接对象JDBC4Connection。
- MultiHostConnectionProxy:作为各种动态类的父类,实现了各种动态类的公共方法,最常见的就是返回当前连接对象给到MultiHostMySQLConnection及其子类。它还是InvocationHandler接口的直接实现类,它重载了invoke方法,并声明了由其子类实现的虚方法invokeMore。invoke方法的实现使用了模板方法这种设计模式。通过invoke方法和子类的invokeMore方法,一起实现了代理模式,即在被代理方法执行之前和之后都添加了一些行为。
- LoadBalancedConnectionProxy作为MultiHostConnectionProxy的子类重载了invokeMore方法,在被代理方法执行后,会通过策略对象计算和更新当前连接对象,以供下次使用。
组件调用顺序:
- 构造连接时各组件调用顺序: