本文主要分享 JDBC 与 读写分离 的实现。为什么会把这两个东西放在一起讲呢?客户端直连数据库的读写分离主要通过获取读库和写库的不同连接来实现,和 JDBC Connection 刚好放在一块。
OK,我们先来看一段 Sharding-JDBC 官方对自己的定义和定位
Sharding-JDBC定位为轻量级java框架,使用客户端直连数据库,以jar包形式提供服务,未使用中间层,无需额外部署,无其他依赖,DBA也无需改变原有的运维方式,可理解为增强版的JDBC驱动,旧代码迁移成本几乎为零。
可以看出,Sharding-JDBC 通过实现 JDBC规范,对上层提供透明化数据库分库分表的访问。
黑科技?实际我们使用的数据库连接池也是通过这种方式实现对上层无感知的提供连接池。甚至还可以通过这种方式实现对 Lucene、MongoDB 等等的访问。
扯远了,下面来看看 Sharding-JDBC jdbc
包的结构:
unsupported
:声明不支持的数据操作方法adapter
:适配类,实现和分库分表无关的方法core
:核心类,实现和分库分表相关的方法
根据 core
包,可以看出分到四种我们超级熟悉的对象
Datasource
Connection
Statement
ResultSet
实现层级如下:JDBC 接口 <=(继承)== unsupported
抽象类 <=(继承)== unsupported
抽象类 <=(继承)== core
类。
本文内容顺序
unspported
包adapter
包插入流程,分析的类:
ShardingDataSource
ShardingConnection
ShardingPreparedStatement(ShardingStatement 类似,不重复分析)
GeneratedKeysResultSet、GeneratedKeysResultSetMetaData
查询流程,分析的类:
ShardingPreparedStatement
ShardingResultSet
读写分离,分析的类:
MasterSlaveDataSource
Sharding-JDBC 正在收集使用公司名单:传送门。