针对Java老项目因数据量过大优化方案

核心:将现有表按年月拆分表,尽量做到每一张表的数据不是很大【千万以内】

步骤一:将现有表拷贝,根据原有数据从起始月开始创建表并重新分配数据。

insert into t_address_202311 select * from t_address WHERE YEAR(createtime) = 2023 AND MONTH(createtime) = 11

步骤二:修改程序,主要是增删改查,项目源码可能是JPA或是mybatis,微改造成如下:

1.实体增加一个字段

        //扩展增加年月字段,不映射数据库字段

        @javax.persistence.Transient

         public String ym;

2.原有程序增加或修改如下:

//addressRepository.save(address); 注释掉,换成下面方法

@Autowired

 private EntityManager entityManager;

=========================insert delete update===============================

String sql = "insert into t_address_"+TimeUtils.getYM()+"(user_id,name,phone,area,area_num,house_num,state) values (?, ?, ?, ?, ?, ?, ?)";

            Query query = entityManager.createNativeQuery(sql);

            query.setParameter(1,address.user_id);

            query.setParameter(2,address.name);

            query.setParameter(3,address.phone);

            query.setParameter(4,address.area);

            query.setParameter(5,address.area_num);

            query.setParameter(6,address.house_num);

            query.setParameter(7,address.state);

            query.executeUpdate();

=============================分页列表=================================

String sql = "select * from t_address_"+ym;

Query query = entityManager.createNativeQuery(sql);

query.setFirstResult((page-1)*size);

query.setMaxResults(size);

String sql1 = "select count(1) from t_address_"+ym;

Query query1 = entityManager.createNativeQuery(sql1);

Object count = query1.getSingleResult();

Integer total = count != null ? Integer.parseInt(count.toString()) : 0;

Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, "pid");  

query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);

List resultList = query.getResultList();

Page<Model> data = new PageImpl<>(resultList,pageable,total);

3.原有列表查询功能增加一个筛选条件,年月筛选,查询不同表就OK。

步骤三:新建一些表作为以后储备,以后的数据会自动按照年月自动插入对应表,1年12张表,10年120张表,一个数据库足以运行很多年了。如果一个数据库达到顶峰,在根据数据特性拆分数据库。

欢迎伙伴们指出这么做有什么漏洞缺陷给我留言,我会尽快回复。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值