用户多点,量大点的项目,需要注意的点

1 数据库连接数,根据需要增加

  datasource:
      dynamic:
        druid: # 全局druid参数,绝大部分值和默认保持一致。(现已支持的参数如下,不清楚含义不要乱设置)
          initial-size:  100
          max-active: 100
          min-idle: 100
          max-wait: 100

2 数据库会超过十万条数据的表,一定要加索引,有经常用来筛选的字段都要加,比如用户id,时间

3 多数据源直接在yml里面添加,不要用数据库添加,用数据库添加无法更改连接数

        datasource:
          master:
            username: AAA
            password: AAAAA
            url: jdbc:mysql://127.0.0.1:3306/AAA?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2b8
            driver-class-name: com.mysql.cj.jdbc.Driver

          B数据源别名:
            username: BBB
            password: BBBBBB
            url: jdbc:mysql://127.0.0.1:3306/BBBB?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2b8
            driver-class-name: com.mysql.cj.jdbc.Driver

4 修改tomcat配置,增加连接数,connector增加maxThreads=“10240” acceptCount=“10240”

5 修改linux默认打开文件句柄数

https://www.e-learn.cn/node/2959291

如果是通过宝塔启动tomcat,需额外修改

https://blog.youkuaiyun.com/LOUISLIAOXH/article/details/87934524

6 数据大于上百万时,不要直接执行全局更新sql,比如 update aa set bb=cc,通过cursor及loop来循环更新,每100条更新提交一次,将大事务转化成小事务,避免耗费数据库资源

//新建临时表存储数据,避免user表字段过多,查询慢
drop table batch_jobs;
create table batch_jobs(id varchar(255),name varchar(255));
insert into batch_jobs(id,name) select id,phone from zk_user;

DELIMITER //
DROP PROCEDURE IF EXISTS loop_user;		//先删除存储过程,避免存储过程存在无法新建
CREATE PROCEDURE loop_user()				//新建存储过程
BEGIN
		declare userId varchar(64);
		declare userName varchar(64);
		declare cnt INT;			//定义循环字段
    DECLARE ids CURSOR FOR SELECT * FROM batch_jobs;			//定义游标
		SET cnt = 0;
    OPEN ids;
        LOOP
						SET cnt = cnt+1;
						if (MOD(cnt,100)=0) then			//设置每100次更新提交一次
							commit;
						end if;
						fetch ids into userId,userName;			//取出游标中的值
						update zk_user set is_system = '1' where id = userId ;				//执行sql操作
        END LOOP;
    CLOSE ids;
END //

CALL loop_user();

7 如果一个update语句要同时更新多个字段,这些字段最好都是不会经常修改那种,比如头像昵称,一些经常修改的字段,比如浏览量什么的,不要和其他字段一起放进一个 update 语句,单独抽离出来,不然很容易出现脏数据。

8 如果有需要异步执行某个方法,一定要注意是否会出现脏数据情况,如果会出现,可以加个延迟

public void A(String userId){
    异步执行{
        B(userId);
    }

    User user = userService.get(userId);
    user.setMoney(1.1);
    userService.save(user);
}

public void B(String userId){
    User user = userService.get(userId);
    user.setType(2);
    userService.save(user);
}

这种情况就大概率会出现脏数据,导致user的money没加进去

8 系统大量 time_wait 请求
没试过
https://blog.youkuaiyun.com/hemin1003/article/details/82963558

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值