文档章节

并发模拟表A迁移至表B

j
 johnli
发布于 2016/09/25 20:29
字数 513
阅读 1
收藏 0

我们经常可能会遇到数据迁移,比如重某个表迁移至另外一个表,可能会有如下场景

1.数据已知清楚明确,比如时间划分明确,我们可以设定多少个线程,每个线程处理不同时间段的数据即可,相对来说比较简单,每个线程处理自己需要处理的数据即可,记录已处理的数据游标以及时间段。 2.根据主键排序处理,每个线程需要获取到当前已处理的游标位置,也就是主键索引位置,此值是需要同步的等待的;以下有两种方法 2.1 当一个线程正在读区到数据,也就是数据准备阶段,那么其他线程得等待当前线程修改修改游标索引 2.2 获取到当前游标锁的线程即马上计算游标位置同步修改,释放锁;

以上2.2方法优于方法2.1,不需要等待其他线程获取数据阶段,只需要等获取锁的线程计算完游标位置即可,不过以下代码是通过2.1的方法实现的;

// 记录当前线程处理游标
volatile static Integer index = 0;
// 模拟缘数据
static List<Integer> data = new ArrayList<Integer>(90000000);
// 处理标记
volatile static boolean flag = true;

static class ThreadA extends Thread {
	String threadName;
	CountDownLatch latch;

	public ThreadA(String threadName, CountDownLatch latch) {
		this.threadName = threadName;
		this.latch = latch;
	}

	@Override
	public void run() {
		while (flag) {
			List<Integer> s = null;
			synchronized (index) {
				// 每次处理100000
				if (index + 1000001 >= data.size()) {
					flag = false;
					int left = data.size() - index;
					s = data.subList(index, index + left);
				} else {
					s = data.subList(index, index + 1000001);
				}
				index = s.get(s.size() - 1);
			}
			if (true) {
				try {
					// 数据处理业务模拟
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("threadName:=" + threadName
						+ " copy data to table B to leng"
						+ s.get(s.size() - 1));
			}

		}
		latch.countDown();
	}

}

public static void main(String[] args) throws InterruptedException {

	long startTime = System.currentTimeMillis();
	for (int i = 0; i < 20000000; i++) {
		data.add(i);
	}
	long endTime = System.currentTimeMillis();

	System.out.println("spend second:=" + (endTime - startTime) / 1000);
	CountDownLatch latch = new CountDownLatch(1);// 两个工人的协作
	ThreadA a = new OtherTest.ThreadA("A", latch);
	ThreadA b = new OtherTest.ThreadA("B", latch);

	startTime = System.currentTimeMillis();
	a.start();
	b.start();
	latch.await();
	endTime = System.currentTimeMillis();
	System.out.println("copy data spend secdon:=" + (endTime - startTime)
			/ 1000);
}

© 著作权归作者所有

j
粉丝 0
博文 7
码字总数 3032
作品 0
程序员
私信 提问
【原创】mysqlslap 使用总结

mysqlslap 可以用于模拟服务器的负载,并输出计时信息。其被包含在 MySQL 5.1 的发行包中。测试时,可以指定并发连接数,可以指定 SQL 语句。如果没有指定 SQL 语句,mysqlslap 会自动生成查...

摩云飞
2013/08/14
0
5
从TB级数据迁移,谈一谈自己的收获

项目背景 电商公司,核心服务重构,百亿级数据迁移,服务必须保证7*24小时不中断。 迁移方案 A、数据转换直接迁移到新库 B、按分库分表的shardId迁移 A方案在服务不中断的时候存在两个问题 ...

EveryDayNew
2016/10/17
63
0
一篇文全面解析Oracle死锁的分类及模拟

作者介绍 前段时间工作上碰到了一个很奇怪的死锁问题,一般来说,由业务发出来的SQL是不太可能会产生死锁的,不过确确实实产生了,而且还是ITL死锁!于是借此机会,也把死锁可能出现的情况都...

李华荣
2016/10/27
0
0
【原创】sysbench 使用总结

sysbench 是一款多线程系统压测工具。可以根据影响数据库服务器性能的各种因素来评估系统的性能。可以用来测试文件I/O,操作系统调度器,内存分配和传输速度,POSIX 线程,以及数据库服务器等...

摩云飞
2013/08/14
0
0
看看这个php mysql 数据完整性的问题

php mysql并发问题: 我以前用MyIsam类型的表时出现这样一个问题,应用场景是这样的:A和B用户之间发消息(web办聊天框AJAX),A给B每发一条消息,消息表中新增一条记录(未读消息标示),然...

xiasf
2015/04/09
175
4

没有更多内容

加载失败,请刷新页面

加载更多

利用mybatis generator生成实体类、Mapper接口以及对应的XML文件

项目中通常会遇到数据的持久化,如果是采用mybatis的orm,就会涉及到生成xml的问题,刚好mybatis官网提供了这么个插件MyBatis Generator,效果简直是棒呆。 1. 首先需要在build.gradle文件中...

啊哈关关
今天
2
0
SpringSocial相关的知识点

使用SprigSocial开发第三方登录 核心类 ServiceProvider(AbstractOauth2ServiceProvider):主要负责实现server提供商(例如QQ,微信等共有的东西),默认实现类是AbstractOauth2ServiceProvider...

chendom
今天
1
0
Java并发之AQS详解

一、概述   谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!   类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源...

群星纪元
昨天
2
0
Fabric-sdk-java最新教程

Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK的最新精选教程。 如果希望快速掌握F...

汇智网教程
昨天
2
0
react 子组件监听props 变化

componentWillReceiveProps //已经被废弃 getDerivedStateFromProps// 推荐使用//如果条件不存在必须要返回null static getDerivedStateFromProps(props, current_stat...

一箭落旄头
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部