Mysql Connector/J 源码分析(综述)


前言

我们使用JAVA语言开发的项目,如果应用需要连接到mysql数据库,必须会使用到mysql的connector/j的包,我们通过它来实现数据的增删改查。接下来我会尝试分析这个包的源码,到底是如何实现这些操作的。这个包有好几块特性,我将分开若干篇章来分析它的底层实现方式。本文先介绍这个包的逻辑结构。

本次分析的版本为5.1.46。若通过maven下载,可添加以下依赖:

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.46</version>
    </dependency>

一、逻辑结构概述

下表从高到低概括了逻辑结构:

部件名称 主要接口、类 主要作用
驱动管理器 java.sql.DriverManager 注册、解除驱动。客户端通过它获取连接。
驱动层 java.sql.Driver 我们常见的用法是接收驱动管理器的命令,生成连接并返回给驱动管理器。
连接层 java.sql.Connection 形成与数据库间的连接。它的基本功能是创建我们常见的Statement、PreparedStatement然后进行一系列的数据操作。除了实现基本操作的实现类外,还有针对不同的场景有不同的实现,这包括:Failover、Loadbalance、Replication。后续文章会详细介绍它们的代码实现。
IO层 com.mysql.jdbc.MysqlIO 以java.net.Socket实现与Mysql数据管理软件的数据交互。我们应用使用到的sql命令,最终通过socket的输出流传到mysql数据库管理软件,然后通过socket的输入流获取操作结果信息。

二、图示逻辑结构

客户端将url和用户名与密码发送给DriverManager,它选出适用的Driver,然后将url等信息传给Driver。Driver收到信息后首先分析url,然后根据结果决定创建connection的类型,它会从普通Connection、FailoverProxy、LoadBalanceProxy或者ReplicationProxy中选其一。Connection使用MysqlIO将用户名与密码和其他信息发送给数据库管理软件,从而形成连接。

从图不难看出,普通Connection是构成其他类型的基础。另外,最后依然通过Socket与数据库管理软件所在的服务器进行通信,这一点始终与OSI7层结构的理论一致的。


总结

相信各位看官对这个包的逻辑结构已有一个总体了解,从体系上看是比较简单的。然而,在简单的背后有着复杂的处理。普通Connection虽作为其他代理的基础, 但是其内部在实现与数据库管理软件交互的过程中不见得简单。不同的代理有自己独特的处理,后续文章我将尽最大努力与大家一起探讨各场景的代码实现。

猜你喜欢

转载自blog.csdn.net/yyb_gz/article/details/108416577