Mysql Connector/J 源码分析(LoadBalance)

前言

本文讨论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方法,在被代理方法执行后,会通过策略对象计算和更新当前连接对象,以供下次使用。

组件调用顺序:

  • 构造连接时各组件调用顺序:
调用者 Driver DriverManager LoadBalancedConnectionProxy JDBC4LoadBalancedMySQLConnection BalanceStrategy JDBC4Connection MysqlIO 调用者 Driver DriverManager LoadBalancedConnectionProxy JDBC4LoadBalancedMySQLConnection
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值