# 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 ```