# DynamicDatabaseSource
**Repository Path**: laofeng/DynamicDatabaseSource
## Basic Information
- **Project Name**: DynamicDatabaseSource
- **Description**: Spring动态数据源,支持的功能: 1、支持主从读写分离,支持一主一从、一主多从及多主多从的场景,支持自动根据操作的类型切换为不同的数据源,如写操作(Insert、Update、Delete)会自动切换为主库操作,读和查操作,则会使用配置的从库; 2、支持分库分表,支持多个库,每个库中多个表的路由规则,根据具体场景实现相应的路由规则即可。
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2019-12-04
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# DynamicDatabaseSource
#### 介绍
生产环境下,单个MySQL在小业务量下,支持读写是没有问题的,但是随着业务量的增加,至少此时需要做的就是将数据库的读写进行分离,以便于支撑更高的流量。
目前有一些中间件可以做无感知的支持读写分离,如MyCAT,在后端配置好主库和重库,其会自动路由写操作到主库,读操作到从库,减少了开发人员的工作量,特别对于旧项目升级,非常的方便。但是引入了中间层,也就意味着处理的流程就变长了,出问题的机率也增加了,响应时间也会加长,其本身也可能随着业务量的增加,成为性能瓶颈。同了为了避免单点,至少得两台服务器搭建高可用集群,前面得再放一层LVS和HAPROXY等,这里又是几台服务器的开销,并且增加了运维成本和工作量。对于追到极致的程序员来说,还是想尽可能的再减少处理环节,提高工作效率。
DynamicDatabaseSource,通过在应用层支持主从的动态路由,其扩展自Spring动态数据源的支持,在主从环境数据环境中,支持自动根据操作的类型切换为不同的数据源,如写操作(Insert、Update、Delete)会自动切换为主库操作,读和查操作,则会使用配置的从库。
主要功能:
1、支持配置一主多从,写走主库,读从多个从库中随机选择一个数据源;
2、支持配置多主多从,写操作从多个库中随机选择一个,不过此时需要当前MySQL集群支持多主,,读从多个从库中随机选择一个数据源;(注:多主目前不支持跨数据库的事务)
3、支持通过方法名称的前缀判断是读操作还是写操作,如以delete、update、insert为前缀的操作,则判断为写操作,将其路由到主库操作,如果是以select、query等为前缀,则判断为读操作,将其路径到从库进行操作;
4、支持通过注解的方式,指定当前操作是读操作还是还写操作,目前支持的注解:
@DataSourceMaster:指定当前操作为写操作
@DataSourceSlave:指定当前操作为读操作
@DataSource:通过Value的方式,指定DataOperateType的操作方式来判断是写操作还是读操作,目前支持的类型为:INSERT("insert"), UPDATE("update"), DELETE("delete"), SELECT("select"), GET("get"),QUERY("query")
5、支持多个分库、每个分库中多个分表的自动路由,使用场景用户需要对抽象net.xiake6.orm.datasource.sharding.ShardingCondition进行实现,自定义数据路由到不同分库、路由到不同分表的规则的实现,可以参看默认的实现示例类:
net.xiake6.orm.datasource.sharding.DefaultTableShardingCondition
net.xiake6.orm.datasource.sharding.DefaultDatabaseShardingCondition
6、包含有相应的单元测试,test/resources下面的test.sql为用于测试的SQL语句,jdbc-sharding.properties为测试数据源的配置,测试类在测试工程下,可以根据实际情况增减测试类。
#### 使用说明-主从数据源配置(applicationContext-db-masterslave-context.xml)
需要在应用方增加类似如下的数据源配置:
```
```
该配置中的关键点:
1、配置多个数据源,并将其存在Map中
```
```
2、指定数据源为动态数据源net.xiake6.orm.datasource.DynamicDataSource:
```
```
3、通过切面的方式控制在执行数据库方法之前,切换主从
```
```
#### 使用说明-分库分表数据源配置(applicationContext-db-sharding-context.xml)
```
${validationQuery}
${validationQuery}
apps
```
分库分表的核心配置
```
apps
```