最近忙于项目已经好久几天没写博客了,前2篇文章我给大家介绍了搭建基础springMvc+mybatis的maven工程,这个简单框架已经可以对付一般的小型项目。但是我们实际项目中会碰到很多复杂的场景,比如数据量很大的情况下如何保证性能。今天我就给大家介绍数据库分库分表的优化,本文介绍mybatis结合当当网的sharding-jdbc分库分表技术(原理这里不做介绍)

  首先在pom文件中引入需要的依赖

<dependency><groupId>com.dangdang</groupId><artifactId>sharding-jdbc-core</artifactId><version>1.4.2</version></dependency><dependency><groupId>com.dangdang</groupId><artifactId>sharding-jdbc-config-spring</artifactId><version>1.4.0</version></dependency>

  二、新建一个sharding-jdbc.xml文件,实现分库分表的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:rdb="http://www.dangdang.com/schema/ddframe/rdb"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.dangdang.com/schema/ddframe/rdb http://www.dangdang.com/schema/ddframe/rdb/rdb.xsd"><rdb:strategy id="tableShardingStrategy" sharding-columns="user_id" algorithm-class="com.meiren.member.common.sharding.MemberSingleKeyTableShardingAlgorithm"/><rdb:data-source id="shardingDataSource"><rdb:sharding-rule data-sources="dataSource"><rdb:table-rules><rdb:table-rule logic-table="member_index" actual-tables="member_index_tbl_${[0,1,2,3,4,5,6,7,8,9]}${0..9}"  table-strategy="tableShardingStrategy"/><rdb:table-rule logic-table="member_details" actual-tables="member_details_tbl_${[0,1,2,3,4,5,6,7,8,9]}${0..9}"  table-strategy="tableShardingStrategy"/></rdb:table-rules></rdb:sharding-rule></rdb:data-source><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="shardingDataSource" /></bean>
</beans>

  这里我简单介绍下一些属性的含义,

   <rdb:strategy id="tableShardingStrategy" sharding-columns="user_id" algorithm-class="com.meiren.member.common.sharding.MemberSingleKeyTableShardingAlgorithm"/>  配置分表规则器  sharding-columns:分表规 则 

  依赖的名(根据user_id取模分表),algorithm-class:分表规则的实现类

  <rdb:sharding-rule data-sources="dataSource"> 这里填写关联数据源(多个数据源用逗号隔开),

  <rdb:table-rule logic-table="member_index" actual-tables="member_index_tbl_${[0,1,2,3,4,5,6,7,8,9]}${0..9}"  table-strategy="tableShardingStrategy"/>  logic-table:逻辑表名(mybatis中代替的表名)actual-tables:

  数据库实际的表名,这里支持inline表达式,比如:member_index_tbl_${0..2}会解析成member_index_tbl_0,member_index_tbl_1,member_index_tbl_2;member_index_tbl_${[a,b,c]}会被解析成

    member_index_tbl_a,member_index_tbl_b和member_index_tbl_c,两种表达式一起使用的时候,会采取笛卡尔积的方式:member_index_tbl_${[a,b]}${0..2}解析为member_index_tbl_a0,member_index_tbl_a1                                       member_index_tbl_a2,member_index_tbl_b0,member_index_tbl_b1,member_index_tbl_b2;table-strategy:前面定义的分表规则器;

三、配置好改文件后,需要修改之前我们的spring-dataSource的几个地方,把sqlSessionFactory和transactionManager原来关联的dataSource统一修改为shardingDataSource(这一步作用就是把数据源全部托管给sharding去管理)

  

 四、实现分表(分库)逻辑,我们的分表逻辑类需要实现SingleKeyTableShardingAlgorithm接口的三个方法doBetweenSharding、doEqualSharding、doInSharding

/*** 分表逻辑* @author zhangwentao**/
public class MemberSingleKeyTableShardingAlgorithm implements SingleKeyTableShardingAlgorithm<Long> {/*** sql between 规则*/public Collection<String> doBetweenSharding(Collection<String> tableNames, ShardingValue<Long> shardingValue) {Collection<String> result = new LinkedHashSet<String>(tableNames.size());Range<Long> range = (Range<Long>) shardingValue.getValueRange();for (long i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) {Long modValue = i % 100;String modStr = modValue < 10 ? "0" + modValue : modValue.toString();for (String each : tableNames) {if (each.endsWith(modStr)) {result.add(each);}}}return result;}/*** sql == 规则*/public String doEqualSharding(Collection<String> tableNames, ShardingValue<Long> shardingValue) {Long modValue = shardingValue.getValue() % 100;String modStr = modValue < 10 ? "0" + modValue : modValue.toString();for (String each : tableNames) {if (each.endsWith(modStr)) {return each;}}throw new IllegalArgumentException();}/*** sql in 规则*/public Collection<String> doInSharding(Collection<String> tableNames, ShardingValue<Long> shardingValue) {Collection<String> result = new LinkedHashSet<String>(tableNames.size());for (long value : shardingValue.getValues()) {Long modValue = value % 100;String modStr = modValue < 10 ? "0" + modValue : modValue.toString();for (String tableName : tableNames) {if (tableName.endsWith(modStr)) {result.add(tableName);}}}return result;}}

五、以上四步,我们就完成了sharding-jdbc的搭建,我们可以写一个测试demo来检查我们的成果

<select id="getDetailsById" resultType="com.meiren.member.dataobject.MemberDetailsDO"parameterType="java.lang.Long">select user_id userId ,qq,email from member_details where     user_id =#{userId} limit 1</select>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private static final String SERVICE_PROVIDER_XML = "/spring/member-service.xml";
      private static final String BEAN_NAME = "idcacheService";
       
      private ClassPathXmlApplicationContext context = null;
      IdcacheServiceImpl bean = null;
      IdcacheDao idcacheDao;
       
      @Before
      public void before() {
          context= new ClassPathXmlApplicationContext(
                  new String[] {SERVICE_PROVIDER_XML});
         idcacheDao=context.getBean("IdcacheDao", IdcacheDao.class);
      }
       
      @Test
      public void getAllCreditActionTest() {
       // int id = bean.insertIdcache();
          Long s=100l;
        MemberDetailsDO memberDetailsDO=idcacheDao.getDetailsById(s);
        System.out.println("QQ---------------------"+memberDetailsDO.getQq());
      }

  打印sql语句,输出结果:QQ-------------------------------------100,证明成功!

  注意点:这次搭建过程中,我有碰到一个小坑,就是执行的时候会报错:,官方文档是有解决方案:引入 <context:property-placeholder location="classpath:/member_service.properties" ignore-unresolvable="true" />  ,引入这行代码的时候,·必须要要把这边管理配配置文件的bean删除,换句话说,即Spring容器仅允许最多定义一个PropertyPlaceholderConfigurer(或<context:property-placeholder/>),其余的会被Spring忽略掉(当时搞了半天啊)

sharding-jdbc整合mybatis相关推荐

  1. SpringBoot + Sharding JDBC,一文搞定分库分表、读写分离

    程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 30 分钟. 来自:blog.csdn.net/qq_40378034/article/details/115264837 S ...

  2. SpringBoot + Sharding JDBC 读写分离、分库分表

    Sharding-JDBC 最早是当当网内部使用的一款分库分表框架,到2017年的时候才开始对外开源,这几年在大量社区贡献者的不断迭代下,功能也逐渐完善,现已更名为 ShardingSphere,20 ...

  3. 【MySQL 读写分离】Sharding JDBC + Spring boot 实现数据库读写分离的登录 Demo

    上篇文章我们搭建了 MySQL 数据库主从复制集群 MySQL 搭建主从复制集群~~~ 本篇文章我们利用搭建好的主从复制集群,使用 SpringBoot 结合 Sharding-JDBC 搭建一个小的 ...

  4. SpringBoot整合MyBatis详细教程~

    目录 1. 导入依赖 2. 连接数据库 3. 编写数据库配置信息 4. 编写pojo实体类 5. 编写mapper接口 6. 编写mapper.xml 7. 编写controller 8. 测试 1. ...

  5. MyBatis - 6.Spring整合MyBatis

    1.查看不同MyBatis版本整合Spring时使用的适配包: http://www.mybatis.org/spring/ 2.下载整合适配包 https://github.com/mybatis/ ...

  6. Spring Boot 教程(三): Spring Boot 整合Mybatis

    教程简介 本项目内容为Spring Boot教程样例.目的是通过学习本系列教程,读者可以从0到1掌握spring boot的知识,并且可以运用到项目中.如您觉得该项目对您有用,欢迎点击收藏和点赞按钮, ...

  7. SpringBoot第六篇:springboot整合mybatis

    本文主要讲解如何在springboot下整合mybatis,并访问数据库.由于mybatis这个框架太过于流行,所以我就不讲解了. 引入依赖 在pom文件引入mybatis-spring-boot-s ...

  8. spring整合mybatis(入门级简单教程1)--在spring中配置c3p0,并成功测试

    引子:spring整合mybatis.因为,我们看完(我就是这样的)spring和mybatis之后,本想自己写一个小小的项目,以便加深理解,但是我发现在spring中整合mybatis并不是一件容易 ...

  9. Play Framework 2.5 整合 MyBatis

    为什么80%的码农都做不了架构师?>>>    因为不想用 Play 官方支持的一些 ORM 框架,笔者开始在网上查询 Play 怎么整合 MyBatis ,但搜出来的结果往往都是 ...

  10. SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例(转)...

    SpringBoot整合mybatis.shiro.redis实现基于数据库的细粒度动态权限管理系统实例 shiro 目录(?)[+] 前言 表结构 maven配置 配置Druid 配置mybatis ...

最新文章

  1. CentOS7.4到Elasticsearch一路坑(五)
  2. eclipse(myeclipse) JavaWeb项目导入Idea2017
  3. PAT Basic 1069. 微博转发抽奖(20)
  4. c++中函数模板的显示具体化
  5. 神经网络 | DeepVO:Towards End-to-End Visual Odometry
  6. Linux java集成安装环境,Linux下Java环境安装
  7. MySQL事务处理与事务隔离(锁机制)
  8. Java基础 Day14 泛型
  9. 现在的娃娃有多智能?
  10. java 网页应用 原理_【转载】Web应用工作原理
  11. POJ 1639 Picnic Planning:最小度限制生成树
  12. 对C语言的程序基本结构框架,C语言的基本框架的.doc
  13. Js跨域解决方法总结
  14. 3.24学习记录(下午)
  15. hibernate数据库扫描实体类的配置
  16. html组件做成圆角,css3制作圆角按钮
  17. 计算机导论应该学什么,《计算机导论A》教学大纲(计算机类)
  18. isilon 时间设置
  19. nginx 搭建静态网站
  20. python二进制格式追加_Python追加/填充二进制文件添加garbag

热门文章

  1. socket编程-查看本机ip和主机名
  2. 棋子--状态压缩dp
  3. 用VS2012或VS2013在win7下编写的程序在XP下运行就出现“不是有效的win32应用程序
  4. Delphi常用关键字用法详解
  5. VC窗口形状的绘制---SetWindowRgn
  6. 深入理解DPDK架构|经典PDF分享
  7. 如何为从 1 到 10 万用户的应用程序,设计不同的扩展方案?
  8. Python中的匿名函数和函数式编程
  9. 音视频技术开发周刊 | 239
  10. 【专题介绍】视频内容生产与消费创新(Part1)