数据库分表之Mybatis+Mysql实践(含部分关键代码)
|
package com.**.uc.utils;
import java.util.Calendar;
import org.apache.commons.lang.StringUtils;
public class TableRouter {
/**
* table路由规则,获取新表名称
* @param prefix 表明前缀
* @param strategy 切分策略,
* @return
*/
public static String getUcCaptchaTable(String prefix,String strategy ){
//根据切分策略进行切分,添加一定的容错,该部分主要是针对读写频繁的验证码表,故部分代码写死为主表的数据;
//切分策略为周时,返回“表名_年份周次”,也就是说一年会有52张表
//切分策略为月时,返回“表名_年份月份”,也就是说一年会有12张表
//该种切分策略的弊端,是在周末凌晨或者月末凌晨的几分钟,存在验证不存在的情况,在我们的系统允许范围内,故此处未做特殊处理。
if(StringUtils.isNotBlank(prefix)&&StringUtils.isNotBlank(strategy)&&prefix.equals("uc_captcha")&&"week".equals(strategy)){
Calendar c=Calendar.getInstance();
int i = c.get(Calendar.WEEK_OF_YEAR);
StringBuffer sb = new StringBuffer();
int year = c.get(Calendar.YEAR);
String suffix = sb.append(year).append(i).toString();
System.out.println(suffix);
return prefix+"_"+suffix;
}else if(StringUtils.isNotBlank(prefix)&&StringUtils.isNotBlank(strategy)&&prefix.equals("uc_captcha")&&"month".equals(strategy)){
Calendar c=Calendar.getInstance();
int i = c.get(Calendar.MONTH);
StringBuffer sb = new StringBuffer();
int year = c.get(Calendar.YEAR);
String suffix = sb.append(year).append(i).toString();
System.out.println(suffix);
return prefix+"_"+suffix;
}
//获取不到分表名称,则返回主表名称
return "uc_captcha";
}
}
|
|
/**插入一条数据 **/
public int add(@Param("table") String table ,@Param("map") Map<String,Object> map);
/**更新一条数据**/
public int update(@Param("table") String table ,@Param("map") Map<String,Object> map);
|
|
<!-- 插入一条新记录 -->
<insert id="add" parameterType="map">
insert into ${table}(pid,btype,uid,naccount,capthcha,ntype,ctime,expiration)
values(
#{map.pid, jdbcType=VARCHAR},
#{map.type, jdbcType=VARCHAR},
#{map.uid, jdbcType=VARCHAR},
#{map.phone, jdbcType=VARCHAR},
#{map.code, jdbcType=VARCHAR},
#{map.is_active, jdbcType=VARCHAR},
#{map.ctime, jdbcType=VARCHAR},
#{map.invalid_time, jdbcType=VARCHAR}
)
<selectKey resultType="int" keyProperty="pid" >
SELECT @@IDENTITY AS pid
</selectKey>
</insert>
|
|
int validation_id = validationDao.add(getCurrentTableName(),map);
|
|
/**
* 获取当前分表名称
*/
public String getCurrentTableName() {
String tableName = TableRouter.getUcCaptchaTable("uc_captcha", strategy);
if(!this._this.existTable(tableName)){//不存在新表,则创建新表,并返回新表表名
try {
int tableCreateRes = validationDao.dynamicCreateTable(tableName);
if(tableCreateRes >=0){
//创建新表,清空表不存在的缓存,
this._this.notExistTable(tableName);
}
} catch (Exception e) {
return "uc_captcha";
}
}
return tableName;
}
/**
* 缓存表是否存在,减轻
*/
@Cacheable(value="uc2cache", key="'uc_captcha_exist_'+#tableName")
public boolean existTable(String tableName){
int tableCount = validationDao.existTable(tableName);
if(tableCount == 0){//不存在新表,则创建新表,并返回新表表名
return false;
}
return true;//存在
}
@CacheEvict(value="uc2cache", key="'uc_captcha_exist_'+#tableName")
public void notExistTable(String tableName){}
|
|
<!-- 查询表是否存在 -->
<select id="existTable" parameterType="String" resultType="Integer">
select count(1)
from information_schema.tables
where LCASE(table_name)=#{table,jdbcType=VARCHAR}
</select>
<!-- 创建表 -->
<update id="dynamicCreateTable" parameterType="String">
CREATE TABLE if not EXISTs ${table} (
`pid` varchar(36) NOT NULL,
`uid` int(11) DEFAULT NULL,
`btype` varchar(30) NOT NULL COMMENT '业务类型例如:sign 用户注册。login 用户登陆',
`ntype` varchar(30) NOT NULL COMMENT '短信、邮箱、微信等。根据系统支持取值',
`naccount` varchar(30) NOT NULL COMMENT '手机号、邮箱、微信等',
`capthcha` varchar(6) NOT NULL COMMENT '6位随机验证码',
`expiration` int(11) NOT NULL COMMENT '有效期,距离1970年秒数',
`ctime` int(11) NOT NULL COMMENT '创建时间距离1970年秒数',
PRIMARY KEY (`pid`),
KEY `fk_uccaptcha_uid` (`uid`),
KEY `uk_uc_captcha_ub` (`btype`) USING BTREE,
CONSTRAINT ${table}_ibfk_1 FOREIGN KEY (`uid`) REFERENCES `uc_users_ext` (`uid`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
</update>
<!--成功返回0 失败会跑错,我们已经做了容错处理-->
|
数据库分表之Mybatis+Mysql实践(含部分关键代码)的更多相关文章
- 重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践
一.MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量. 关于数据库的扩展主要包括:业务拆分.主从复制.读写分离.数据库分库 ...
- MySQL数据库分表的3种方法
原文地址:MySQL数据库分表的3种方法作者:dreamboycx 一,先说一下为什么要分表 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目 ...
- 【大数据和云计算技术社区】分库分表技术演进&最佳实践笔记
1.需求背景 移动互联网时代,海量的用户每天产生海量的数量,这些海量数据远不是一张表能Hold住的.比如 用户表:支付宝8亿,微信10亿.CITIC对公140万,对私8700万. 订单表:美团每天几千 ...
- zabbix 数据库分表操作
近期zabbix数据库占用的io高,在页面查看图形很慢,而且数据表已经很大,将采用把数据库的数据目录移到新的磁盘,将几个大表进行分表操作 一.数据迁移: 1.数据同步到新的磁盘上,先停止mysql(不 ...
- Mycat(4):消息表mysql数据库分表实践
本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/46882777 未经博主同意不得转载. 1,业务需求 比方一个社交软件,比方像腾讯 ...
- 一致性Hash算法在数据库分表中的实践
最近有一个项目,其中某个功能单表数据在可预估的未来达到了亿级,初步估算在90亿左右.与同事详细讨论后,决定采用一致性Hash算法来完成数据库的自动扩容和数据迁移.整个程序细节由我同事完成,我只是将其理 ...
- 什么是分表和分区 MySql数据库分区和分表方法
1.为什么要分表和分区 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性 ...
- MySQL数据库分表分区(一)(转)
面对当今大数据存储,设想当mysql中一个表的总记录超过1000W,会出现性能的大幅度下降吗? 答案是肯定的,一个表的总记录超过1000W,在操作系统层面检索也是效率非常低的 解决方案: 目前针对 ...
- mysql 数据库分表小实例
项目开发中,我们的数据库数据越来越大,随之而来的是单个表中数据太多.以至于查询书读变慢,而且由于表的锁机制导致应用操作也搜到严重影响,出现了数据库性能瓶颈. 当出现这种情况时,我们可以考虑分表,即将单 ...
随机推荐
- SpringCloud学习笔记(4)——Zuul
参考Spring Cloud官方文档第19章 19. Router and Filter: Zuul 路由是微服务架构的一部分.例如,"/"可能映射到你的web应用,"/ ...
- Go同步和异步执行多个任务封装
同步执行类RunnerAsync 支持返回超时检测,系统中断检测 错误常量定义 //超时错误 var ErrTimeout = errors.New("received timeout&qu ...
- Tsung脚本中使用动态参数(一)---直接在脚本里编写Erlang代码
杀死一个程序猿,只要改三次需求.同理,杀死一个接口自动化测试人员,只要改三次接口数据处理方式.我目前的状态,改了一次接口数据处理方式,有一种胸闷的感觉. 因为改需求,所以,要改脚本.T_T.所以,才有 ...
- 【C#】发票助手二维码生成
之前一起吃饭听说了发票助手这个东西,可以生成发票抬头的二维码,扫码就可以开票了. 官方也有个小程序的 [税务发票助手],微信中搜这个名字就可以了. 我准备在自己的小程序中也尝试一下,本来觉得只要拼接一 ...
- 初识mysql学习笔记
使用VMVirtualBox导入Ubuntu后,可以通过sudo apt-get install mysql-server命令下载mysql. 在学习过程中,我遇到了连接不上Xshell的问题.最终在 ...
- cs231n spring 2017 lecture16 Adversarial Examples and Adversarial Training 听课笔记
(没太听明白,以后再听) 1. 如何欺骗神经网络? 这部分研究最开始是想探究神经网络到底是如何工作的.结果人们意外的发现,可以只改变原图一点点,人眼根本看不出变化,但是神经网络会给出完全不同的答案.比 ...
- DOCKER 开发学习记录
DOCKER常用命令及参数 DOCKER镜像管理命令: 检索:docker search image_name 下载:docker pull image_namge 查看本地镜像:docker ima ...
- HUST 1585 排队
1585 - 排队 时间限制:1秒 内存限制:128兆 351 次提交 179 次通过 题目描述 BG站在一个有n个人的队伍中,但他并不知道他处于队伍中的哪个位置,他向前向后观察,只能断定他的前方有至 ...
- Java 大数类BigInteger和BigDecimal的基本函数
在Java中有两个类BigInteger和BigDecimal分别表示不可变的任意精度的整数和不可变的有符号的任意精度的十进制数(浮点数).主要用于高精度计算中.这两个类使得java中的大数,高精度运 ...
- msf
show exploit show payload msf使用数据库加快搜索,不然每次都等半天 service postgresql startmsfdb reinitmsf > db_rebu ...