我是靠谱客的博主 满意樱桃,最近开发中收集的这篇文章主要介绍mysql update 优化_mysql updated 优化更新的方式,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

这是基于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 优化更新的方式所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部