`
lixjluck
  • 浏览: 104380 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

并发的几个解决方案

阅读更多

1、 最简单的,页面的《提交》按钮,在点击后(校验通过后)Disabled,这样用户就不会重复点击《提交》按钮;

2、 数据库表增加唯一性索引(比如memberId),这个只能解决一般(为什么一般,继续看)并发插入的问题;

如果两条一样的数据插入,只有一条会成功,另外一次插入失败;

3、 使用乐观锁,在Table里增加一个version int字段,这个可以保证更新操作的并发问题;

Select version, .. from table1 where id=?

//do biz

Update set version=version+1 where id=? And version=?

在代码里,需要判断update返回的更新条数(count ==1?true:false)来判断本次更新是否成功

4、 使用悲观锁,一般使用数据库提供的功能(不建议);

select for update(悲观锁)

//do biz

Update (事物提交,锁释放)

5、 有时候,数据库不能加唯一性索引(比如由memberId,status两个字段,业务要求memberId,status=approved的数据唯一,其他状态的数据不做限制);

这个时候,需要寻求新的协调中心(之前是数据库光荣的承担这一角色),我们现在使用的Memcached可以完成这个任务,利用memcached协议规定add的原子性,详细请点击这里

我们在信联项目里使用了这个方案,有一个缺点,就是需要侵入到业务代码里来控制并发,参考代码:     

方式1-回调(推荐):

 try {

     concurrentTemplate.execute(key, new ConcurrentCallback() {

         public Object doInConcurrent() {

             // do your biz

             return null;

         }

     });

 } catch (ConcurrentException e) {

     // catch this exception

     // return value;

 }

方式二:自助获取和释放锁

 ConcurrentLock lock = null;

 try {

     lock = concurrentTemplate.acquireLock(key);

     // do your biz

 } catch (ConcurrentException e) {

     // catch this exception

     // return value;

 } finally {

     concurrentTemplate.releaseLock(lock);

 }

ConcurrentTemplate实现代码,很简单

public class ConcurrentTemplate implements InitializingBean {

    private static final Logger  log                = LoggerFactory.getLogger(ConcurrentTemplate.class);
    private static final Boolean DEFAULT_VALUE      = Boolean.TRUE;
    
    private CacheTemplate cacheTemplate;

   
    public void afterPropertiesSet() throws Exception {
        if (cacheTemplate== null) throw new IllegalArgumentException("cacheTemplateis null.");
    }

    /**
     * 执行具体的并发控制,需要实现ConcurrentCallback接口
     * 
     * @param key
     * @param ccb
     * @return Object
     * @throws ConcurrentException
     */
    public Object execute(String key, ConcurrentCallback ccb) throws ConcurrentException {
        ConcurrentLock lock = null;
        try {
            // 默认值为true,防止Counter出错引起业务不可继续执行
            lock = acquireLock(key);
            return ccb.doInConcurrent();
        } finally {
            releaseLock(lock);
        }
    }

    /**
     * 获取一把锁,需要捕获异常
     * 
     * @param key 锁的粒度,由业务来定义
     * @throws ConcurrentException 发生并发,抛异常
     * @see releaseLock
     */
    public ConcurrentLock acquireLock(String key) throws ConcurrentException {
        // 默认值为true,防止Counter出错引起业务不可继续执行
        boolean flag = true;
        ConcurrentLock lock = null;
        try {
            flag = cacheTemplate.add(key, DEFAULT_VALUE);
        } catch (StoreException e) {
            log.error("key:" + key, e);
        }
        if (!flag) throw new ConcurrentException();

        lock = new ConcurrentLock();
        lock.setKey(key);
        return lock;
    }

    /**
     * 释放锁,一般要放在finally里操作
     * 
     * @param key 锁的粒度
     */
    public void releaseLock(ConcurrentLock lock) {
        if (lock == null) return;
        releaseLock(lock.getKey());
    }

    /**
     * 释放锁,一般要放在finally里操作
     * 
     * @param key 锁的粒度
     */
    private void releaseLock(String key) {
        try {
            cacheTemplate.remove(key);
        } catch (StoreException e) {
            log.error("key:" + key, e);        }
    }

}

 

 

1
0
分享到:
评论

相关推荐

    javaweb高并发量网站解决方案

    一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目 录下,这样的网站对系统架构、性能的要求都很简单。...这几个解决思路在一定程度上意味着更大 的投入。

    高并发的常见应对方案

    对于高并发系统,我们需要关注以下几个关键指标: 1. **QPS(Queries Per Second)**:每秒钟的查询次数。这是衡量系统处理能力的重要指标之一。 2. **响应时间**:从客户端发起请求到接收到响应的时间长度。理想...

    java并发编程与高并发解决方案

    在探讨Java并发编程与高并发解决方案之前,我们首先需要理解几个关键概念:并发(Concurrency)、高并发(High Concurrency)以及多线程(Multithreading)。这些概念是现代软件开发中不可或缺的一部分,尤其是在...

    Java多线程并发访问解决方案

    本文将深入探讨Java中的多线程并发访问解决方案,主要围绕以下几个核心知识点进行阐述: 1. **线程同步机制**: - **synchronized关键字**:Java中的synchronized提供了一种内置锁机制,它可以保证同一时间只有一...

    架构层面高并发解决方案

    在探讨高并发解决方案之前,首先需要明确几个关键概念。 - **并发**:在操作系统中指的是一个时间段内多个程序同时处于运行状态,但在任何给定时刻只有一个程序在处理器上执行。 - **并发访问**:指同一时间内对...

    Java系统的高并发解决方法详解

    上面提供的几个解决思路在一定程度上也意味着更大的投入,并且这样的解决思路具备瓶颈,没有很好的扩展性,下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。 一、HTML静态化 静态化其实大家都知道,...

    Java并发编程与高并发解决方案笔记-基础篇.docx

    Java并发编程与高并发解决方案是开发高性能应用的关键技术。在基础篇中,主要涉及以下几个重要知识点: 1. **并发编程基础** - **并发**:并发是指在一个时间段内,多个线程交替执行,使得系统看起来像是同时处理...

    非常全面的高性能高并发服务器架构解决方案

    高性能高并发服务器架构解决方案 高性能高并发服务器架构是指一种能够处理大量用户请求和高并发访问的服务器架构解决方案。在当前的互联网时代,高性能高并发服务器架构已经成为网站运营商和开发者的必备技术之一。...

    Java并发编程与高并发解决方案(高清视频教程).rar

    本教程的高清视频将通过实例讲解以上概念,并提供实战经验,帮助开发者更好地理解和掌握Java并发编程,提升高并发解决方案的设计能力。阅读提供的"Java并发编程与高并发解决方案(高清视频教程).txt"文件,可以...

    C#Socket高并发,socket高并发解决方案,C/C++

    在设计高并发Socket服务器时,有几个核心概念需要理解: 1. **连接池**:为了减少建立和销毁Socket连接的开销,可以使用连接池策略,预先创建一定数量的Socket实例,当有新连接请求时,直接从池中获取而不是每次新建...

    企业内真实高并发解决成熟方案视频

    一套成熟的高并发解决方案应包括以下几个关键方面: 1. **负载均衡**:通过负载均衡器,我们可以将流量分散到多个服务器上,避免单点过载。常见的负载均衡技术有轮询、最少连接数、IP哈希等策略。 2. **缓存策略**...

    JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程

    ### JAVA并发编程与高并发解决方案 #### 一、并发编程基础 ##### 1.1 并发的概念 在计算机科学中,并发是指多个任务或进程同时进行的现象。它不同于并行,后者指的是多个处理器或核心同时执行不同的指令。在Java中...

    服务器高并发负载解决方案.docx

    下面将详细介绍解决方案中的几个关键点。 防盗链 防盗链是指防止其他网站盗用本站的资源,例如图片、音频、视频、css、js 等。盗链会加重服务器的负担,影响服务器的性能和稳定性。防盗链有多种方式,例如 Referer ...

    PHP并发场景的几种解决方案.docx

    在PHP中,处理并发场景是一项挑战,特别是在秒杀、抢购等高并发业务中,防止超卖和确保数据一致性至关重要。...在实际应用中,可能还需要结合其他技术,如队列、分布式锁等,来构建更健壮的并发解决方案。

    高并发网站系统架构解决方案

    ### 高并发网站系统架构解决方案 #### 一、引言 随着互联网的快速发展和技术的不断进步,现代网站尤其是大型网站面临着前所未有的挑战。这些挑战主要体现在处理大量的用户访问请求、高并发请求等方面。为了应对...

    高并发网站架构设计方案

    镜像技术包括专业解决方案和经济型软件实现,如Linux的开源工具。 综上所述,设计高并发网站架构需要综合运用上述策略,根据实际需求进行优化和调整,以确保系统在面对大规模用户访问时的稳定性和高性能。

    EntityFramework并发冲突解决方案.docx

    ### EntityFramework并发冲突解决方案 #### 一、并发冲突概述 在多用户系统中,尤其是在Web应用环境下,多个用户可能会同时尝试修改同一数据记录。这种情况下,如果没有适当的并发控制机制,可能会导致数据不一致...

    JAVA并发编程与高并发解决方案-并发编程四之J.U.C之AQS.docx

    ### JAVA并发编程与高并发解决方案-并发编程四之J.U.C之AQS #### 引言 《JAVA并发编程与高并发解决方案-并发编程四之J.U.C之AQS》是一篇详细介绍Java实用并发工具包(Java Util Concurrency,简称J.U.C.)中重要...

Global site tag (gtag.js) - Google Analytics