fix:修复SQLITE库中没有RAND函数;[SQLITE_ERROR] SQL error or missing database (no such function: RAND)

This commit is contained in:
gemail1024 2025-04-14 15:03:10 +08:00
parent bcc980d2b2
commit 5efe67306e
4 changed files with 80 additions and 5 deletions

View File

@ -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);
}

View File

@ -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) {

View File

@ -56,7 +56,7 @@ spring:
--- # redis
spring:
redis:
#禁用redis使用本地缓存
#是否禁用redistrue禁用redis使用本地缓存
disabled: true
# 地址
host: localhost

View File

@ -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>