mirror of
https://github.com/oddfar/campus-imaotai.git
synced 2026-06-03 21:00:53 +08:00
fix:修复SQLITE库中没有RAND函数;[SQLITE_ERROR] SQL error or missing database (no such function: RAND)
This commit is contained in:
parent
bcc980d2b2
commit
5efe67306e
@ -4,6 +4,8 @@ import com.oddfar.campus.business.entity.IUser;
|
||||
import com.oddfar.campus.common.core.BaseMapperX;
|
||||
import com.oddfar.campus.common.core.LambdaQueryWrapperX;
|
||||
import com.oddfar.campus.common.domain.PageResult;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
import org.apache.ibatis.annotations.Update;
|
||||
|
||||
import java.util.List;
|
||||
@ -75,5 +77,13 @@ public interface IUserMapper extends BaseMapperX<IUser> {
|
||||
"ORDER BY RAND();")
|
||||
void updateUserMinuteEven();
|
||||
|
||||
// Mapper方法
|
||||
|
||||
void batchUpdateUserMinute(@Param("list") List<IUser> users);
|
||||
|
||||
// Mapper方法
|
||||
@Select("SELECT * FROM i_user WHERE user_id > #{maxId} ORDER BY user_id LIMIT #{limit}")
|
||||
List<IUser> selectUsersBatch(@Param("maxId") Long maxId, @Param("limit") int limit);
|
||||
|
||||
int deleteIUser(Long[] iUserId);
|
||||
}
|
||||
|
||||
@ -1,7 +1,9 @@
|
||||
package com.oddfar.campus.business.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.oddfar.campus.business.entity.IUser;
|
||||
import com.oddfar.campus.business.mapper.IUserMapper;
|
||||
import com.oddfar.campus.business.service.IUserService;
|
||||
@ -9,6 +11,7 @@ import com.oddfar.campus.common.domain.PageResult;
|
||||
import com.oddfar.campus.common.exception.ServiceException;
|
||||
import com.oddfar.campus.common.utils.SecurityUtils;
|
||||
import com.oddfar.campus.common.utils.StringUtils;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Service;
|
||||
@ -92,12 +95,61 @@ public class IUserServiceImpl implements IUserService {
|
||||
@Async
|
||||
public void updateUserMinuteBatch() {
|
||||
Long userCount = iUserMapper.selectCount();
|
||||
if (userCount > 60) {
|
||||
iUserMapper.updateUserMinuteEven();
|
||||
}else {
|
||||
iUserMapper.updateUserMinuteBatch();
|
||||
if (userCount < 60) {
|
||||
// 如果用户数小于60,查询全部用户并更新
|
||||
batchUpdateUserMinute();
|
||||
} else {
|
||||
// randomMinute 0:随机,1:不随机
|
||||
//原逻辑批量处理为什么没有加:random_minute = "0"限制条件?为了保持原逻辑 我这里也没加
|
||||
updateUserMinuteEven();
|
||||
}
|
||||
}
|
||||
private void batchUpdateUserMinute() {
|
||||
//使用lambda查询
|
||||
LambdaQueryWrapper<IUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||
//0:随机,1:不随机
|
||||
lambdaQueryWrapper.eq(IUser::getRandomMinute, "0");
|
||||
List<IUser> users = iUserMapper.selectList(lambdaQueryWrapper);
|
||||
if(CollectionUtils.isEmpty(users)){
|
||||
return;
|
||||
}
|
||||
// 使用 Hutool 生成1-50之间的随机数
|
||||
for (IUser user : users) {
|
||||
user.setMinute(RandomUtil.randomInt(1, 51)); // 随机生成 1-50 之间的数字
|
||||
}
|
||||
iUserMapper.batchUpdateUserMinute(users); // 批量更新数据库
|
||||
}
|
||||
|
||||
private void updateUserMinuteEven() {
|
||||
Long maxId = 0L;
|
||||
// 一次查询1000条数据
|
||||
int limitCount = 1000;
|
||||
|
||||
while (true) {
|
||||
// 每次查询1000条数据,使用 maxId 进行分页
|
||||
List<IUser> users = iUserMapper.selectUsersBatch(maxId, limitCount);
|
||||
|
||||
// 如果查询结果为空,终止循环
|
||||
if (CollectionUtils.isEmpty(users)) {
|
||||
break;
|
||||
}
|
||||
|
||||
// 更新这批用户的minute字段,分配1-50的数字
|
||||
for (IUser user : users) {
|
||||
user.setMinute(RandomUtil.randomInt(1, 51)); // 使用 Hutool 生成随机数
|
||||
}
|
||||
|
||||
// 批量更新用户的 minute 字段
|
||||
iUserMapper.batchUpdateUserMinute(users);
|
||||
if(users.size() < limitCount){
|
||||
break;
|
||||
}
|
||||
|
||||
// 更新 maxId 为当前批次中的最大 id
|
||||
maxId = users.get(users.size() - 1).getUserId(); // 获取当前批次最后一条记录的 ID,作为下次查询的起始点
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int deleteIUser(Long[] iUserId) {
|
||||
|
||||
@ -56,7 +56,7 @@ spring:
|
||||
--- # redis
|
||||
spring:
|
||||
redis:
|
||||
#禁用redis,使用本地缓存
|
||||
#是否禁用redis,true:禁用redis使用本地缓存
|
||||
disabled: true
|
||||
# 地址
|
||||
host: localhost
|
||||
|
||||
@ -9,4 +9,17 @@
|
||||
#{id}
|
||||
</foreach>
|
||||
</delete>
|
||||
<update id="batchUpdateUserMinute" parameterType="java.util.List">
|
||||
UPDATE i_user
|
||||
SET `minute` = CASE user_id
|
||||
<foreach collection="list" item="user">
|
||||
WHEN #{user.userId} THEN #{user.minute}
|
||||
</foreach>
|
||||
ELSE `minute`
|
||||
END
|
||||
WHERE user_id IN
|
||||
<foreach collection="list" item="user" open="(" separator="," close=")">
|
||||
#{user.userId}
|
||||
</foreach>
|
||||
</update>
|
||||
</mapper>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user