概述
这是基于spring的代码,基于其他照葫芦画瓢就行了,我电脑是4核,开了5个线程(并发5个线程),线程数=cpu核心数+1,按这个规则来package com.example.demo;
import com.sun.jmx.remote.internal.ArrayQueue;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicLong;
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
private Long total;
// 声明volatile关键字为了保证可见性,多线程2大特性,一:原子性,二:可见性
private volatile Semaphore semaphore;
private volatile AtomicLong aleary;// 已经取了多少条
private volatile AtomicLong real;// 真实已执行了多少条
private volatile AtomicLong threadCount;// 执行第几次线程
@Autowired
private JdbcTemplate jdbcTemplate;
@Before
private void init(){
// 初始化总数,因为我看你的事a表根据b表更新
total = jdbcTemplate.queryForObject("SELECT COUNT(id) FROM B",Long.class);
// 初始化信号量(并发锁数量)
semaphore = new Semaphore(5);
// 初始化已经取了0条
aleary = new AtomicLong(0);
real = new AtomicLong(0);
threadCount = new AtomicLong(0);
}
@Test
public void contextLoads() {
// 开始多线程执行
for(int i=0;i
new Thread(new Runnable() {
@Override
public void run() {
// 获取一把锁
try {
semaphore.acquire();
System.out.println("第"+threadCount.addAndGet(1)+"个线程进来了...");
List> list = jdbcTemplate.queryForList("SELECT id,pass FROM B LIMIT " + aleary.longValue() + "," + 1000);// 取一千条数据,最后一次可能取不到1000条数据不过无所谓,
aleary.addAndGet(1000);// 增加1000 ,最后已处理数量会比总数多,无所谓,不影响,其就是为了标记,对了,把mysql的max_allowed_package设大一点,要不取1000条数据可能不让取
list.forEach((l)->{// jdk8 新特性,lamb表达式,jdk版本低的话改为普通for循环
try {
// 忽略错误插入
jdbcTemplate.update("UPDATE IGNORE A SET pass=? WHERE id=?",new Object[]{l.get("pass"),l.get("id")});
} catch (DataAccessException e) {// try catch 忽略异常
e.printStackTrace();
}finally {
System.out.println(real.addAndGet(1));
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
semaphore.release();// 释放锁
}
}
});
}
}
}
最后
以上就是满意樱桃为你收集整理的mysql update 优化_mysql updated 优化更新的方式的全部内容,希望文章能够帮你解决mysql update 优化_mysql updated 优化更新的方式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复