高并发下数据库插入重复数据,有什么好方法呢?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

高并发下数据库插入重复数据,有什么好方法呢?

2016-03-05 13:50:40 6657 2
ServiceA{
     // 根据username查询数据库中是否存在该数据
     Method isInDB(String username); 
     //保存用户
     Method saveUser() {
           boolean  flag = Method isInDB(username);
           if(!flag){
              //判断数据库中没有才 执行insert 操作
           }
     }
}

以上是我的java代码,我用loadrunner 进行压力测试,在saveuser前设置集合点,直接使用300用户并发操作,结果数据库会保存进许多重复username的记录,我自己从网上也查了许多资料有人给了我以下建议
1、保存用户逻辑采用储存过程操作,把并发压力交给数据库处理
2、数据库对username字段加上唯一约束,这样插入重复记录时 抛出异常,利用事务进行回滚
除了以上两种方法外,我想请大家给出第三种解决方案,其实这种就类似与高并发下的用户注册功能

取消 提交回答
全部回答(2)
  • 慕之
    2019-07-17 18:53:20

    补充一点, 高并发场景上要考虑是使用内存还是缓存, 建议是使用缓存memcache或者redis都行, 防止并发量过高导致内存爆掉。

    0 0
  • 小旋风柴进
    2019-07-17 18:53:20
    //缓存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实现相同用户名在统一时间只存在一次保存数据。

    在保存数据之前,验证数据库中是否还存在同名数据,如果不存在,直接保存.

    0 0
添加回答
相关问答

1

回答

数据节点同时向什么汇报名称节点维护的映射信息呢?

2021-12-05 10:27:30 200浏览量 回答数 1

1

回答

基于事件触发的响应适合用什么来构建数据处理应用?

2021-01-14 19:16:39 552浏览量 回答数 1

1

回答

influxDB 插入数据失败 ?报错

2020-06-09 16:22:37 975浏览量 回答数 1

0

回答

首先将数据插入到由3个表创建的映射表中

2019-12-10 19:37:15 414浏览量 回答数 0

1

回答

电商大屏 大家推荐用什么来做吗? 我比较倾向用数据库,因为有些数据需要join其他表,flink充

2019-12-02 17:34:58 1147浏览量 回答数 1

1

回答

数据库中几张表引擎能否改为myisam引擎

2018-08-28 11:51:28 696浏览量 回答数 1

1

回答

数据库创建表失败

2016-12-31 11:39:29 2363浏览量 回答数 1

1

回答

用sqoop时,hive创建表的结构一定要和数据库结构一样吗

2016-05-28 16:37:09 3424浏览量 回答数 1

1

回答

用spring aop处理日志,在往数据库插入日志出错时,会影响主线程吗

2016-03-03 14:49:55 2541浏览量 回答数 1

1

回答

mysql 重复插入数据问题

2016-02-08 13:34:15 2449浏览量 回答数 1
2709
文章
6591
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载