1. 概述

本文主要分享 JDBC读写分离 的实现。为什么会把这两个东西放在一起讲呢?客户端直连数据库的读写分离主要通过获取读库和写库的不同连接来实现,和 JDBC Connection 刚好放在一块。

OK,我们先来看一段 Sharding-JDBC 官方对自己的定义和定位

Sharding-JDBC定位为轻量级java框架,使用客户端直连数据库,以jar包形式提供服务,未使用中间层,无需额外部署,无其他依赖,DBA也无需改变原有的运维方式,可理解为增强版的JDBC驱动,旧代码迁移成本几乎为零。

可以看出,Sharding-JDBC 通过实现 JDBC规范,对上层提供透明化数据库分库分表的访问。

黑科技?实际我们使用的数据库连接池也是通过这种方式实现对上层无感知的提供连接池。甚至还可以通过这种方式实现对 Lucene、MongoDB 等等的访问。

扯远了,下面来看看 Sharding-JDBC jdbc 包的结构:

数据库中间件 Sharding-JDBC 源码分析 —— JDBC实现与读写分离_java

  • unsupported:声明不支持的数据操作方法

  • adapter:适配类,实现和分库分表无关的方法

  • core:核心类,实现和分库分表相关的方法

根据 core 包,可以看出分到四种我们超级熟悉的对象

  • Datasource

    数据库中间件 Sharding-JDBC 源码分析 —— JDBC实现与读写分离_java_02


  • Connection

    数据库中间件 Sharding-JDBC 源码分析 —— JDBC实现与读写分离_java_03


  • Statement

    数据库中间件 Sharding-JDBC 源码分析 —— JDBC实现与读写分离_java_04


  • ResultSet

    数据库中间件 Sharding-JDBC 源码分析 —— JDBC实现与读写分离_java_05


实现层级如下:JDBC 接口 <=(继承)== unsupported抽象类 <=(继承)== unsupported抽象类 <=(继承)== core


本文内容顺序

  1. unspported 包

  2. adapter 包

  3. 插入流程,分析的类:

  • ShardingDataSource

  • ShardingConnection

  • ShardingPreparedStatement(ShardingStatement 类似,不重复分析)

  • GeneratedKeysResultSet、GeneratedKeysResultSetMetaData

查询流程,分析的类:

  • ShardingPreparedStatement

  • ShardingResultSet

读写分离,分析的类:

  • MasterSlaveDataSource


Sharding-JDBC 正在收集使用公司名单:传送门。