数据库分表之Mybatis+Mysql实践(含部分关键代码…
2018-06-27 09:55:36来源:未知 阅读 ()
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 失败会跑错,我们已经做了容错处理-->
|
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:浅析final关键字
- 拼多多三面惨败,问题在于java中间件、数据库与spring框架. 2020-06-04
- 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文 2020-05-31
- Docker容器启动时初始化Mysql数据库 2020-05-27
- Mybatis显示修改数据库成功,数据库却没有修改 2020-05-22
- Java面试常被问到这道题:如何保证缓存与数据库的双写一致性 2020-05-16
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash