java实现动态实现“分表”

首先说一下,这个功能其实也不算是很少见,但是也没那么常见。
有的时候涉及到的数据量比较大,我们会用一个很时髦的词“分表”来实现。但是其实更多时候这个表是按照时间来“分”的,所以我这里是一种不那么动态,但是也实现了分表的方式实现的。
先说一下大概的情况:我们这里是硬件设备数据的存储,每个设备开机的情况下30s推送一次数据。简单算一下,如果100个设备同时开机,一个月的记录数就是:
每分钟2条 * 60分钟 * 24小时 *100台机器 * 31天


一个月八百九十万条数据

所以说这个按照时间分表确实是有必要的。甚至说我这里按照月分只是一个根据具体情况定下来的一个行为,如果有必要按照天分也ok啊,当然了,不管是按照月,还是天,甚至星期我这个方法都是可以的.下面说下具体的做法。
首先我这里简单说下我用的是spring boot+mybatis (plus)框架,所以很多实现也是基于这两个框架的实现。还有我这里只是提供一个思路,具体的实现不建议和我学,容易被骂。

创建表

既然要按照月分表,起码每个月的表是要有的吧,但是一口气创建几十个未来月份的表也太扯了,所以这里是用定时任务创建表实现的。
这个定时任务不难,创建表也不难,但是刚刚说的不要和我学确实真的, 真的我用了一种非常偷懒的方式,我在mybatis的注解里直接写了sql语句,大家有时间的话还是建议在xml里写,我从定时任务开始贴代码:
(顺便复习一下spring boot中的定时器)

  1. 启动类加上支持定时任务的注释:@EnableScheduling
  2. 随便写一个类,纳入容器中,然后cron表达式写清楚时间,里面就是具体定时执行的代码了:
@Component
public class Quartz {
    
    @Autowired
    UserEquipDao userEquipDao;

    @Scheduled(cron = "0 0 0 28 * ?")
    public void createTable() {
        Date date = DateUtils.addDateDays(new Date(), 5);
        String name = new SimpleDateFormat("yyyyMM").format(date);
        userEquipDao.createTable(name);
    }
}

注意:我这里是每个月是28号启动定时任务(因为这个版本不支持cron中L表示最后一天,因为每个月都有28号,所以愉快的定在了每月28执行),然后这个月生成的是下个月的记录表,所以我这里是把年月当成参数传的,每月28日加五天,肯定是下个月的月份,这都是细节处理,具体要根据情况做。
然后注意了,这个UserEquipDao userEquipDao其实就是随便一个能操作数据库的接口,在这里只是借用一下而已,你用 用户表啊,订单表啊都是可以的。
接下来我让你看看具体这个方法里怎么写的:

生成表的方法

当当当!惊不惊喜?意不意外?套着insert的壳子,里面就是一个创建表的语句。只要这个sql语句能正常运行就没问题啦!
有两个小的注意点:

  • 这个name参数要用注解,不然会说找不到
  • 在sql语句中用的是{},而不是#{}。这两个的原因简单说一下{}是单纯的文字替换,不能阻挡注入攻击,但是#{}是set进去的字符串,平时我们用#{}是更好的结果,但是因为这个语句的特殊,所以一定要用${}(我这块说的比较唯心,原理也没说清楚,反正不懂的记住就行了)。

然後只要写法没问题,这个创建表的语句是不会有问题的啦,建议大家可以定时到一个比较近的时间试一遍看看能不能正常的创建表,一般不会有问题的。
对了,我建议大家把sql语句写到xml文件里,毕竟我这样写法不规范。

对表的crud操作

其实刚刚的表创建完了,剩下的就没啥难的了。主要就是crud操作了。查询的话最后说。
首先一个和表对应的实体类是必不可少的,这个就不用多说了,只不过实体的类名字可以自由一点点了。我的话也没那么放飞自己,只是实体里,没有表中后面的时间而已。属性名我是严格按照数据库字段来的,这个没啥好说的。

但是因为dao和表名不一样,所以所有的数据库操作都用sql语句实现的。并且增加和查询都要具体到某个表中,所以这个时间参数还是要传过来,并且用${}拼接到sql语句中的。
下面是简单的两个demo:

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author lisijia
 * @since 2020-07-29
 */
@Mapper
public interface SysRecordDao extends BaseMapper<SysRecord> {
    
    @Insert("INSERT INTO sys_record${name} (no,content,create_time) VALUES(#{sysRecord.no},#{sysRecord.content},#{sysRecord.createTime})")
    void addRecord(@Param("name")String name,SysRecord sysRecord);
    
    @Select("SELECT * FROM sys_record${name} WHERE no = #{no} ORDER BY create_time DESC LIMIT 1")
    SysRecord selectLastRecord(@Param("name")String name,@Param("no")String no);
    
}

细节上注意两个参数的拼接方式的不同。但是基本用法应该很好理解了。而且这个也要看需求和细节,比如我这边因为最后一条记录一定是3分钟前,所以只要查当月的就行了,这个name参数是我用yyyyMM获取来的。
因为暂时这个只是一个记录的作用,所以是没有修改删除操作的,所以这里也不多说了。

查询操作

查询一直都是一个大问题,而且很多时候查询操作确实挺多,但是像是这种按照时间分表了,一般多是记录多的,也不会出现一查查好几个月的数据,反正我们这个要求查询时间跨度不能超过三天,所以我这里也是一种极简的方式。起始时间不过不在一个月,则分两次查询,结果集再放到一起,如果起始时间是一个月,就是一个查询而已。
当然了,这块其实也可以用union连表查询,我这算是偷懒了吧,反正是勉强把功能实现了。
特定的情况有特定的处理措施,这也是我最开始就把这么做的背景讲出来的原因,这个方法适合我这样的,但是不一定也适合别的,做之前要仔细思量。然後今天的笔记就记到这里,如果稍微帮到你了记得点个喜欢点个关注,也祝大家工作顺顺利利,java技术交流群130031711,欢迎各位踊跃加入!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350