ServiceA{
// 根据username查询数据库中是否存在该数据
Method isInDB(String username);
//保存用户
Method saveUser() {
boolean flag = Method isInDB(username);
if(!flag){
//判断数据库中没有才 执行insert 操作
}
}
}
以上是我的java代码,我用loadrunner 进行压力测试,在saveuser前设置集合点,直接使用300用户并发操作,结果数据库会保存进许多重复username的记录,我自己从网上也查了许多资料有人给了我以下建议
1、保存用户逻辑采用储存过程操作,把并发压力交给数据库处理
2、数据库对username字段加上唯一约束,这样插入重复记录时 抛出异常,利用事务进行回滚
除了以上两种方法外,我想请大家给出第三种解决方案,其实这种就类似与高并发下的用户注册功能
补充一点, 高并发场景上要考虑是使用内存还是缓存, 建议是使用缓存memcache或者redis都行, 防止并发量过高导致内存爆掉。
//缓存map,防止同一时间多个相同用户进行数据保存
private static Map<String,String> map = new ConcurrentHashMap<String,String>();
private boolean isInCache(String username){
synchronized (map)
{
if(map.containsKey(username)){
return true;
}else{
map.put(username, username);
}
}
return false;
}
//验证数据库中是否存在同名用户
public abstract boolean isInDB(String userName);
public void saveUser(String username){
if(!isInCache(username)){
if(!isInDB(username)){
saveUser();
//移除map中的key
synchronized (map)
{
map.remove(username);
}
}
}
}
//保存进数据库
public abstract void saveUser();
通过一个同步map实现相同用户名在统一时间只存在一次保存数据。
在保存数据之前,验证数据库中是否还存在同名数据,如果不存在,直接保存.
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。