范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

分库分表实战可运行demo

  为什么要分库分表
  关系型数据库以MySQL为例,单机的存储能力、连接数是有限的,它自身就很容易会成为系统的瓶颈。当单表数据量在百万以内时,我们还可以通过 添加从库、优化索引提升性能  。
  一旦数据量朝着 千万以上趋势增长  ,再怎么优化数据库,很多操作性能仍下降严重。为了减少数据库的负担,提升数据库响应速度,缩短查询时间,这时候就需要进行分库分表  。如何分库分表
  分库分表就是要将 大量数据分散到多个数据库  中,使每个数据库中数据量小响应速度快  ,以此来提升数据库整体性能  。
  针对数据切分类型,大致可以分为: 垂直(纵向)切分和水平(横向)切分  两种。以下是分库分表的demopackage com.lyz.sharding.algorithm; import java.util.Collection;   import java.util.LinkedHashSet;      import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;   import com.dangdang.ddframe.rdb.sharding.api.strategy.database.SingleKeyDatabaseShardingAlgorithm;   import com.google.common.collect.Range;      /**   * user表分库的逻辑函数   * @author liuyazhuang   *   */   public class StudentSingleKeyDatabaseShardingAlgorithm implements SingleKeyDatabaseShardingAlgorithm{          /**       * sql 中关键字 匹配符为 =的时候,表的路由函数       */   	public String doEqualSharding(Collection availableTargetNames, ShardingValue shardingValue) {           for (String each : availableTargetNames) {               if (each.endsWith(shardingValue.getValue() % 2 + "")) {                   return each;               }           }           throw new IllegalArgumentException();       }          /**       * sql 中关键字 匹配符为 in 的时候,表的路由函数       */ 	public Collection doInSharding(Collection availableTargetNames, ShardingValue shardingValue) {           Collection result = new LinkedHashSet(availableTargetNames.size());           for (Integer value : shardingValue.getValues()) {               for (String tableName : availableTargetNames) {                   if (tableName.endsWith(value % 2 + "")) {                       result.add(tableName);                   }               }           }           return result;       }          /**       * sql 中关键字 匹配符为 between的时候,表的路由函数       */   	     public Collection doBetweenSharding(Collection availableTargetNames,               ShardingValue shardingValue) {           Collection result = new LinkedHashSet(availableTargetNames.size());           Range range = (Range) shardingValue.getValueRange();           for (Integer i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) {               for (String each : availableTargetNames) {                   if (each.endsWith(i % 2 + "")) {                       result.add(each);                   }               }           }           return result;       }      }   ```  ``` package com.lyz.sharding.algorithm;  import java.util.Collection;   import java.util.LinkedHashSet;      import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;   import com.dangdang.ddframe.rdb.sharding.api.strategy.table.SingleKeyTableShardingAlgorithm;   import com.google.common.collect.Range;      /**   * 因为t_student实际表在每个库中只有2个,所以 %2   * @author iuyazhuang  *   */   public class StudentSingleKeyTableShardingAlgorithm implements SingleKeyTableShardingAlgorithm{          /**       * sql 中 = 操作时,table的映射       */       public String doEqualSharding(Collection tableNames, ShardingValue shardingValue) {           for (String each : tableNames) {               if (each.endsWith("0".concat(String.valueOf(shardingValue.getValue() % 2)))) {                   return each;               }           }           throw new IllegalArgumentException();       }          /**       * sql 中 in 操作时,table的映射       */       public Collection doInSharding(Collection tableNames, ShardingValue shardingValue) {           Collection result = new LinkedHashSet(tableNames.size());           for (Integer value : shardingValue.getValues()) {               for (String tableName : tableNames) {                   if (tableName.endsWith("0".concat(String.valueOf(value % 2)))) {                       result.add(tableName);                   }               }           }           return result;       }          /**       * sql 中 between 操作时,table的映射       */       public Collection doBetweenSharding(Collection tableNames,               ShardingValue shardingValue) {           Collection result = new LinkedHashSet(tableNames.size());           Range range = (Range) shardingValue.getValueRange();           for (Integer i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) {               for (String each : tableNames) {                   if (each.endsWith("0".concat(String.valueOf(i % 2)))) {                       result.add(each);                   }               }           }           return result;       }      }   ```  ```  package com.lyz.sharding.algorithm;    import java.util.Collection;   import java.util.LinkedHashSet;    import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;   import com.dangdang.ddframe.rdb.sharding.api.strategy.database.SingleKeyDatabaseShardingAlgorithm;   import com.google.common.collect.Range;    /**   * user表分库的逻辑函数   * @author liuyazhuang  *   */   public class UserSingleKeyDatabaseShardingAlgorithm implements SingleKeyDatabaseShardingAlgorithm{        /**       * sql 中关键字 匹配符为 =的时候,表的路由函数       */       public String doEqualSharding(Collection availableTargetNames, ShardingValue shardingValue) {           for (String each : availableTargetNames) {               if (each.endsWith(shardingValue.getValue() % 2 + "")) {                   return each;               }           }           throw new IllegalArgumentException();       }        /**       * sql 中关键字 匹配符为 in 的时候,表的路由函数       */       public Collection doInSharding(Collection availableTargetNames, ShardingValue shardingValue) {           Collection result = new LinkedHashSet(availableTargetNames.size());           for (Integer value : shardingValue.getValues()) {               for (String tableName : availableTargetNames) {                   if (tableName.endsWith(value % 2 + "")) {                       result.add(tableName);                   }               }           }           return result;       }        /**       * sql 中关键字 匹配符为 between的时候,表的路由函数       */       public Collection doBetweenSharding(Collection availableTargetNames,               ShardingValue shardingValue) {           Collection result = new LinkedHashSet(availableTargetNames.size());           Range range = (Range) shardingValue.getValueRange();           for (Integer i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) {               for (String each : availableTargetNames) {                   if (each.endsWith(i % 2 + "")) {                       result.add(each);                   }               }           }           return result;       }    }   ```  ```  package com.lyz.sharding.algorithm;    import java.util.Collection;   import java.util.LinkedHashSet;    import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;   import com.dangdang.ddframe.rdb.sharding.api.strategy.table.SingleKeyTableShardingAlgorithm;   import com.google.common.collect.Range;   /**   * 因为t_student实际表在每个库中只有3个,所以 %3   * @author iuyazhuang  *   */   public class UserSingleKeyTableShardingAlgorithm implements SingleKeyTableShardingAlgorithm{        /**       * sql 中 = 操作时,table的映射       */       public String doEqualSharding(Collection tableNames, ShardingValue shardingValue) {           for (String each : tableNames) {               if (each.endsWith(("0".concat(String.valueOf(shardingValue.getValue() % 3))))) {                   return each;               }           }           throw new IllegalArgumentException();       }        /**       * sql 中 in 操作时,table的映射       */       public Collection doInSharding(Collection tableNames, ShardingValue shardingValue) {           Collection result = new LinkedHashSet(tableNames.size());           for (Integer value : shardingValue.getValues()) {               for (String tableName : tableNames) {                   if (tableName.endsWith(("0".concat(String.valueOf(value % 3))))) {                       result.add(tableName);                   }               }           }           return result;       }        /**       * sql 中 between 操作时,table的映射       */       public Collection doBetweenSharding(Collection tableNames,               ShardingValue shardingValue) {           Collection result = new LinkedHashSet(tableNames.size());           Range range = (Range) shardingValue.getValueRange();           for (Integer i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) {               for (String each : tableNames) {                   if (each.endsWith(("0".concat(String.valueOf(i % 3))))) {                       result.add(each);                   }               }           }           return result;       }    }     ```  ``` package com.lyz.sharding.entity;  import java.io.Serializable;  /**  * 学生类  * @author liuyazhuang  *  */ public class Student implements Serializable {  	private static final long serialVersionUID = 8920597824668331209L;  	private Integer id;  	private Integer studentId;  	private String name;  	private Integer age;  	public Integer getId() { 		return id; 	}  	public void setId(Integer id) { 		this.id = id; 	}  	public Integer getStudentId() { 		return studentId; 	}  	public void setStudentId(Integer studentId) { 		this.studentId = studentId; 	}  	public String getName() { 		return name; 	}  	public void setName(String name) { 		this.name = name; 	}  	public Integer getAge() { 		return age; 	}  	public void setAge(Integer age) { 		this.age = age; 	}  	@Override 	public String toString() { 		return "Student [id=" + id + ", studentId=" + studentId + ", name=" + name + ", age=" + age + "]"; 	} 	 } ```  ``` package com.lyz.sharding.entity;  import java.io.Serializable;  /**  * 用户类  * @author liuyazhuang  *  */ public class User implements Serializable {  	private static final long serialVersionUID = 1L;  	private Integer id;  	private Integer userId;  	private String name;  	private Integer age;  	public Integer getId() { 		return id; 	}  	public void setId(Integer id) { 		this.id = id; 	}  	public Integer getUserId() { 		return userId; 	}  	public void setUserId(Integer userId) { 		this.userId = userId; 	}  	public String getName() { 		return name; 	}  	public void setName(String name) { 		this.name = name; 	}  	public Integer getAge() { 		return age; 	}  	public void setAge(Integer age) { 		this.age = age; 	}  	@Override 	public String toString() { 		return "User [id=" + id + ", userId=" + userId + ", name=" + name + ", age=" + age + "]"; 	}  } ```  ``` package com.lyz.sharding.mapper;  import java.util.List; import com.lyz.sharding.entity.Student;  /**  * 处理学生的数据操作接口  * @author liuyazhuang  *  */ public interface StudentMapper {              Integer insert(Student s);              List findAll();              List findByStudentIds(List studentIds);    }     ```  ``` package com.lyz.sharding.mapper;  import java.util.List; import com.lyz.sharding.entity.User;         /**  * 处理用户的数据操作接口  * @author liuyazhuang  *  */ public interface UserMapper {              Integer insert(User u);              List findAll();              List findByUserIds(List userIds);             }   ```  ``` package com.lyz.sharding.service.impl; import javax.annotation.Resource;  import org.springframework.stereotype.Service;  import com.lyz.sharding.entity.Student; import com.lyz.sharding.mapper.StudentMapper; import com.lyz.sharding.service.StudentService;    @Service   public class StudentServiceImpl implements StudentService{              @Resource       public StudentMapper studentMapper;          public boolean insert(Student student) {           return studentMapper.insert(student) > 0 ? true : false;       }      }   ```  ``` package com.lyz.sharding.service.impl;  import java.util.List;  import javax.annotation.Resource;  import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional;  import com.lyz.sharding.entity.Student; import com.lyz.sharding.entity.User; import com.lyz.sharding.mapper.StudentMapper; import com.lyz.sharding.mapper.UserMapper; import com.lyz.sharding.service.UserService;     @Service   @Transactional   public class UserServiceImpl implements UserService {          @Resource       public UserMapper userMapper;              @Resource       public StudentMapper studentMapper;          public boolean insert(User u) {           return userMapper.insert(u) > 0 ? true :false;       }          public List findAll() {           return userMapper.findAll();       }          public List findByUserIds(List ids) {           return userMapper.findByUserIds(ids);       }          @Transactional(propagation=Propagation.REQUIRED)       public void transactionTestSucess() {           User u = new User();           u.setUserId(13);           u.setAge(25);           u.setName("war3 1.27");           userMapper.insert(u);                      Student student = new Student();           student.setStudentId(21);           student.setAge(21);           student.setName("hehe");           studentMapper.insert(student);       }          @Transactional(propagation=Propagation.REQUIRED)       public void transactionTestFailure() throws IllegalAccessException {           User u = new User();           u.setUserId(13);           u.setAge(25);           u.setName("war3 1.27 good");           userMapper.insert(u);                      Student student = new Student();           student.setStudentId(21);           student.setAge(21);           student.setName("hehe1");           studentMapper.insert(student);           throw new IllegalAccessException();       }          }   ```  ```  package com.lyz.sharding.service;  import com.lyz.sharding.entity.Student;  /**  * 处理学生的service  * @author liuyazhuang  *  */ public interface StudentService {        boolean insert(Student student);    }   ```  ``` package com.lyz.sharding.service;    import java.util.List; import com.lyz.sharding.entity.User;  /**  * 处理用户的Service  * @author liuyazhuang  *  */ public interface UserService {              public boolean insert(User u);              public List findAll();              public List findByUserIds(List ids);              public void transactionTestSucess();              public void transactionTestFailure() throws IllegalAccessException;    }   ```  ``` <?xml version="1.0" encoding="UTF-8" ?>                                                             insert into t_student (student_id,name,age) values (#{studentId},#{name},#{age})                                           id,student_id,name,age               ```  ``` <?xml version="1.0" encoding="UTF-8" ?>                                                             insert into t_user (user_id,name,age) values (#{userId},#{name},#{age})                                           id,user_id,name,age               ```  ``` jdbc_driver0   = com.mysql.jdbc.Driver jdbc_url0      = jdbc:mysql://localhost:3306/sharding_0 jdbc_username0 = root jdbc_password0 = root    jdbc_driver1   = com.mysql.jdbc.Driver jdbc_url1      = jdbc:mysql://localhost:3306/sharding_1 jdbc_username1 = root jdbc_password1 = root       validationQuery=SELECT 1 ```  ``` <?xml version="1.0" encoding="UTF-8"?>                                                                  classpath:config/resource/jdbc_dev.properties                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ```  ``` <?xml version="1.0" encoding="UTF-8"?>                                                                                                                                                                                                                                                                                                                           t_user_00                   t_user_01                   t_user_02                                                                                                                                                                                                                                                                                                                       t_student_00                   t_student_01                                                                                                                                                                                                                                                                                                                                                                                                                                                                        ```  ```  package com.lyz.sharding.test;    import java.util.Arrays; import java.util.List;  import javax.annotation.Resource;  import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;  import com.lyz.sharding.entity.Student; import com.lyz.sharding.entity.User; import com.lyz.sharding.service.StudentService; import com.lyz.sharding.service.UserService;  /**  * 测试分库分表规则  * @author liuyazhuang  *  */ @RunWith(SpringJUnit4ClassRunner.class)   @ContextConfiguration(locations = { "classpath*:config/spring/spring-database.xml", "classpath*:config/spring/spring-sharding.xml" })   public class ShardingJdbcMybatisTest {        @Resource       public UserService userService;              @Resource       public StudentService studentService;        @Test       public void testUserInsert() {           User u = new User();           u.setUserId(11);           u.setAge(25);           u.setName("github");           Assert.assertEquals(userService.insert(u), true);       }              @Test       public void testStudentInsert() {           Student student = new Student();           student.setStudentId(21);           student.setAge(21);           student.setName("hehe");           Assert.assertEquals(studentService.insert(student), true);       }        @Test       public void testFindAll(){           List users = userService.findAll();           if(null != users && !users.isEmpty()){               for(User u :users){                   System.out.println(u);               }           }       }              @Test       public void testSQLIN(){           List users = userService.findByUserIds(Arrays.asList(1));           if(null != users && !users.isEmpty()){               for(User u :users){                   System.out.println(u);               }           }       }              @Test       public void testTransactionTestSucess(){           userService.transactionTestSucess();       }              @Test(expected = IllegalAccessException.class)       public void testTransactionTestFailure() throws IllegalAccessException{           userService.transactionTestFailure();       }   }
  以上代码在本地是可以运行的,需要配置好环境,连上数据库。

世卫组织人工智能的年龄歧视可能严重影响老年人健康品玩2月10日讯,据界面新闻引法新社消息,世卫组织周三警告说,人工智能系统正越来越多地用于医疗保健,但系统中的偏见有可能加深对老年人的歧视。世卫组织在一份政策简报中说,人工智能技术新科技对经济发展的推动与投资机会促进经济发展的因素有很多,但科学技术在其中确起着相当重要的作用。在当前时代,则起着决定性的作用。科技提高了劳动生产率。当下科学技术特别是高科技已经融合渗透,扩散到生产力诸要素中,使元宇宙在落地过程中会遭遇哪些困难和挑战?如何解决?来源科技日报在大量算法的加持之下,元宇宙所产生的新型视觉场景,会让更多的人沉浸在虚拟世界中不能自拔。如何维系现实世界和元宇宙之间的正面互动关系,发挥元宇宙的积极作用,抑制消极作用,苹果春季发布会新iPhoneSE领跑多款M2新设备亮相CNMO新闻在去年的苹果秋季发布会上,凭借A15处理器的跑分,iPhone新产品线再一次刷新了移动设备的性能天花板。据国外知名爆料人MarkGurman透露,苹果将在3月的春季发布操作系统SSH协议知识介绍今天给大家分享SSH协议相关的知识介绍,希望对大家能有所帮助!1SSH协议概念介绍SSH(SecureShell)安全外壳协议,是一种建立在应用层基础上的安全协议,通过对密码进行加情人节礼物送女友什么合适?情人节适合送女友的礼物推荐情人节是一个很有氛围的日子,这个节日里,送礼物是一个很有仪式感的事情,无论送啥,都是表达心意的,让她在收到礼物的时候也体验一把被爱的幸福,既惊喜又甜蜜。是不是正愁不知道给女朋友送什3000块钱买一个戴森吹风机,你觉得值不值?看看用过的人怎么说畅谈关于装修的那些事,分享装修的各种经验和知识。大家好,我是畅谈装修,关注我即可了解更多关于装修的那些事!问3000块钱买一个非常出名的戴森吹风机,你觉得值不值呢?好用吗?答几年前2年经验前端面试网易灵犀!太注重工程化了题目一面1聊项目2webpack和rollup的区别,打包出来的产物有什么区别?3postcss的原理4webpackbabelvue都用到了AST,你是怎么理解AST的?5如何提如何看待苹果计划推出非接触式点击支付功能?2月8日消息苹果计划推出点击支付功能,如何解读此举?对此都有哪些相关信息值得关注?苹果公司周二(2月8日)在官网发布公告称,计划在iPhone上推出点击支付(Taptopay)功能Python其实很简单第十六章目录管理为实现按名存取,必须建立文件名与辅存空间中物理地址的对应关系,体现这种对应关系的数据结构称为文件目录。文件目录表目至少要包含文件名文件的类型文件的长度访问权限建立时间访问时间和文件整新活!摩托罗拉全新翻盖折叠设计专利曝光,比Razr5G还夸张智能手机发展的未来趋势究竟在哪里?折叠屏会是手机行业的最终形态吗?这些问题现在还无法给出确定答案,但作为行业先驱者,摩托罗拉已经开始了行动。现在手机行业的发展遇到了一定的瓶颈期,厂
阿里P9大佬带你了解计算机组成原理计算机系统概述计算机系统概述1。计算机硬件的基本构成存储程序的概念是指将指令以二进制代码的形式事先输入计算机的主存储器,然后按其在存储器中的地址执行程序的第一条指令,以后就按该程序的规定顺序执行阿里巴巴的蒋凡卸了那么多职位,和2020年事件有关系吗?如果不是蒋凡的老婆到公司大闹,一切可能就是悄无声息,至多一切处理妥当了,外界突然发现,蒋凡换老婆了。其他的,几乎无人关心。别说换一次,就是换十次,别人也不会过问。有钱人换老婆,与换郭明錤苹果正测试9英寸OLED折叠屏,有望在2025年推出可折叠产品近日,苹果分析师郭明錤在社交平台表示,苹果正在测试一款9英寸OLED折叠屏,他认为,苹果的折叠屏开发最初是专注于中型和更大屏幕设备,最后才会扩展到iPhone这样的小屏设备上。其补网友贪便宜3100买iPhone12,一查发现有配置锁,属于企业定制机俗话说买的没有卖的精,你以为自己捡漏了,其实可能商家正暗自窃喜!终于卖出去了!这台iPhone12就是如此,该机成色极品,没有网络锁,价格还很便宜。网友以为自己捡漏了!没想到却是企登上Nature子刊!东北女教授取得重磅科研成果,引发国际关注!近日,吉林大学生命科学学院韩葳葳教授美国密苏里大学电气工程和计算机科学系许东教授科研团队的最新研究成果在顶级学术期刊NatureCommunications正式发表。论文第一完成单微信再次确认,微信将添三大新功能虽说微信在社交领域的拓展无人能及,但是在金融支付方面却有着支付宝这一拦路虎的出现。我们都知道相比起微信而言,支付宝在金融支付方面更为出色,旗下的花呗借呗就赶超微信的微粒贷等金融服务电商平台的SEO如何来做?在讲课程SEO中,发现学生都是一知半解的,尤其是很多童鞋在做不仅在做SEO相关工作时,对SEO不太清楚,更不用说能够举一反三,对电商平台SEO有所认知。其实无论是用户使用常规搜索引单反微单和拍照手机大行其道,为什么很多人还要买卡片相机?随着互联网的不断发展,目前已经进入到一个随时随刻分享的时代你去一家有特色的餐馆吃饭,或者你到一个地方游玩,或者你和朋友一起去滑雪骑行,或者你去看风景,觉得不错就可以随手拿出手机拍几为什么越发达的国家,越不重视电商行业的发展?内行人做出总结引言在我国快速发展的这几十年里,互联网绝对成为促进经济发展的一大主力,互联网的繁荣与昌盛也直接促进了电商事业的发展,但也有人发现,似乎电商只有在中国红红火火,为什么那些发达国家似乎美威胁对中国半导体断供,英国却对着干,批准中企收购英芯片厂商因为某些反华政客阻拦,而被迫搁置的中国企业安世半导体收购英国最大芯片生产商NWF一事,现在迎来了转机。近日,美国媒体政治新闻网曝料称,英国政府已经悄悄批准安世半导体收购NewporJava中的this关键字通常情况下,调用当前对象的属性或方法,省略this关键字,特殊情况下,比如方法(或者构造器)的形参和类的属性同名时,我们必须显示调用this。StringnamepublicJTe