优化用户会话sessionId

This commit is contained in:
启航 2026-03-10 22:30:10 +08:00
parent a3ced7b444
commit 8adf745796
2 changed files with 36 additions and 8 deletions

View File

@ -1,10 +1,14 @@
package cn.qihangerp.erp.serviceImpl;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import cn.qihangerp.service.IAiConversationHistoryService;
/**
* 会话管理服务用于管理用户的会话ID
*/
@ -13,6 +17,9 @@ public class SessionManager {
private static final Map<Long, String> userIdSessionMap = new ConcurrentHashMap<>();
private static final Map<String, Long> sessionUserIdMap = new ConcurrentHashMap<>();
@Autowired
private IAiConversationHistoryService aiConversationHistoryService;
/**
* 获取或创建用户的会话ID
* @param userId 用户ID
@ -22,11 +29,28 @@ public class SessionManager {
if (userId == null) {
return null;
}
return userIdSessionMap.computeIfAbsent(userId, k -> {
String sessionId = UUID.randomUUID().toString();
// 先从内存缓存中获取
String sessionId = userIdSessionMap.get(userId);
if (sessionId != null) {
return sessionId;
}
// 内存缓存中没有从数据库中查找
List<String> sessionIds = aiConversationHistoryService.getSessionIdsByUserId(userId);
if (sessionIds != null && !sessionIds.isEmpty()) {
// 使用第一个会话ID
sessionId = sessionIds.get(0);
userIdSessionMap.put(userId, sessionId);
sessionUserIdMap.put(sessionId, userId);
return sessionId;
});
}
// 数据库中也没有创建新的会话ID
sessionId = UUID.randomUUID().toString();
userIdSessionMap.put(userId, sessionId);
sessionUserIdMap.put(sessionId, userId);
return sessionId;
}
/**

View File

@ -37,10 +37,14 @@
</select>
<select id="selectSessionIdsByUserId" parameterType="Long" resultType="String">
select distinct session_id
from ai_conversation_history
where user_id = #{userId}
order by create_time desc
select session_id
from (
select session_id, max(create_time) as max_create_time
from ai_conversation_history
where user_id = #{userId}
group by session_id
) as temp
order by max_create_time desc
</select>
<delete id="deleteBySessionId" parameterType="String">