有时候并发操作太猛了,会对共享资源(DB、或者网络资源)造成伤害,简单记录一下控制并发速率的几种策略
1.使用信号量, java.util.concurrent.Semaphore
public void migrate(List<Long> list) throws InterruptedException { long lastMigId = 0; final Semaphore semaphore = new Semaphore(5); if(CollectionUtils.isNotEmpty(list)) { semaphore.acquire(); WORKER.execute(new Runnable() { @Override public void run() { try { //batchUpdate(list); } finally { semaphore.release(); } } }); } }
2.类似Semaphore,使用com.google.common.util.concurrent.RateLimiter,控制一秒操作多少个,类似QPS的概念。
比如mysql没法执行批量更新的时候,要循环更新,这时候最好做一些并发控制,如
if (CollectionUtils.isNotEmpty(needToInsertList)) { final RateLimiter limiter = RateLimiter.create(Constants.RateLimiter_Size); for(ScheduledSellingInfo info : needToInsertList) { limiter.acquire(); scheduledSellingInfoRepository.replace(info); } }
再比如多线程环境下:
public void incrementMigrateWithSalesNo1(Collection<Long> salesNoList) { if (CollectionUtils.isNotEmpty(salesNoList)) { final RateLimiter limiter = RateLimiter.create(2000); for (final Long salesNo : salesNoList) { limiter.acquire(); Runnable task = new Runnable() { @Override public void run() { try { List<SellBrandRelation> list = vipGoodsDao.getSellBrandRelationBySalesNo(salesNo); if(CollectionUtils.isNotEmpty(list)) { batchUpdate(list); } } finally { //to dosomeing } } }; WORKER.execute(task); } } } public final static ExecutorService WORKER = Executors.newFixedThreadPool(20, new NamedThreadFactory("migrate"));
3.RateLimiter和阑珊结合java.util.concurrent.CountDownLatch
如:
public void incrementMigrateWithSalesNo(Collection<Long> salesNoList) { if (CollectionUtils.isNotEmpty(salesNoList)) { final RateLimiter limiter = RateLimiter.create(2000); final CountDownLatch latch = new CountDownLatch(salesNoList.size()); for (final Long salesNo : salesNoList) { limiter.acquire(); Runnable task = new Runnable() { @Override public void run() { try { List<SellBrandRelation> list = vipGoodsDao.getSellBrandRelationBySalesNo(salesNo); if(CollectionUtils.isNotEmpty(list)) { batchUpdate(list); } } finally { latch.countDown(); } } }; WORKER.execute(task); } latch.await(); } }
相关推荐
数据库并发控制是数据库管理系统中的关键组成部分,特别是在多用户系统中,确保数据的一致性和完整性至关重要。并发控制的主要目的是防止多个事务在访问共享资源时产生不正确的数据状态,从而避免诸如丢失更新、脏读...
分布式数据库并发控制是数据库系统中的一个重要领域,尤其在多处理器或多节点环境中,多个事务可能同时对数据库进行操作,这就会引入一系列并发问题。并发执行在单处理器和多处理器环境下都有可能发生,不同的是,在...
### 数据库并发控制的基本方法 #### 一、并发控制概览 在数据库系统中,**并发控制**是一项关键的技术,用于确保多个事务能够同时访问数据而不引起数据不一致的问题。并发控制的目标是使得多个事务的并发执行看...
在数据库管理系统中,并发控制是确保多用户环境下数据一致性与完整性的关键机制。DB2和Oracle都是广泛应用的关系型数据库,它们都采用了锁作为主要的并发控制手段。本文将对比分析DB2和Oracle的并发控制,特别是锁的...
数据库思维导图——并发控制 并发控制 多事务执行方式 (1)事务串行执行 每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行 不能充分利用系统资源,发挥数据库共享资源的特点 (2)交叉并发方式...
并发控制概论 本章节主要讨论数据库系统中的并发控制技术,旨在解决多用户数据库系统中并发事务执行带来的问题。数据库管理系统必须提供并发控制机制,以确保事务的隔离性和数据库的一致性。 11.1 并发控制概述 ...
### 数据库并发控制及其在SQL Server 2000中的应用 #### 一、并发控制概述 在现代数据库管理系统(DBMS)中,**并发控制**是一项关键的技术,尤其是在多用户环境中,它确保了多个事务能够同时访问数据库而不会导致...
事务和并发控制是数据库管理中的核心概念,特别是在使用ORM框架如Hibernate时,理解它们的工作原理至关重要。本文将深入探讨Hibernate中的事务管理和并发控制。 首先,事务是数据库操作的基本单位,它保证了数据的...
并发控制是数据库管理系统中至关重要的一个方面,它确保在多用户环境下,多个事务可以同时进行而不会破坏数据的完整性。并发控制的主要目标是避免事务之间的冲突,防止出现诸如脏读、不可重复读和幻读等问题。 脏读...
锁的运用是并发控制的核心,它能够在多用户环境中协调不同事务的操作,防止数据冲突和异常状态的出现,如脏读、不可重复读和幻觉读。 ### 并发控制的重要性 在现代数据库系统中,尤其是像Oracle这样的大型关系型...
数据库并发控制PPT学习教案 数据库并发控制是数据库管理系统(DBMS)中一个非常重要的概念。它是指在多个事务同时访问数据库时,如何确保事务之间的一致性和隔离性,防止数据不一致和丢失。 在数据库并发控制中,...
分布式事务并发控制是分布式系统中确保多个参与节点间事务一致性的关键技术。在分布式系统中,事务可能需要同时在多个服务器上执行,这就要求系统能够在这些服务器之间进行协调,以保证事务的ACID属性(原子性、一致...
在数据库管理中,事务管理是至关重要的一个环节,它涵盖了并发控制和恢复机制,确保数据在多用户同时访问时的完整性和一致性。本章主要讨论的是如何在数据库系统中实现有效的事务管理和处理并发操作的问题。 首先,...
分布式数据库系统的并发控制方法是现代信息技术领域中的一个重要研究方向,主要目标是保证在分布式环境下多个用户或进程同时访问数据库时的正确性和一致性。本文详细探讨了这一领域的理论基础和技术实践。 首先,...
数据库并发控制是数据库管理系统中的关键组成部分,其目的是确保在多用户环境下,多个事务同时执行时,数据的完整性和一致性不受影响。并发控制的主要任务是防止事务间的不正确交互,如脏读、不可重复读和幻读等现象...
"数据库原理与设计课件:第9章 并发控制" 本节课主要讲解数据库系统中的并发控制理论和技术。并发控制是数据库系统中的一种机制,用于确保多个事务并发执行时的正确性和一致性。 首先,数据库系统具有多用户特征,...
然而,分布式数据库系统的并发控制成为了系统性能优劣的决定性因素。 并发控制的核心问题是,当多个用户或进程同时对数据库进行读写操作时,如何确保数据的完整性和一致性。若处理不当,就可能出现数据丢失、读脏...