java多线程操作mysql数据库使用cpu过高怎么解决?
在做多数据同步到mysql数据库时,由于单线程处理数据较慢,所以考虑用多线程。

这里大多数都是mysql
单独看下mysql的cpu可以达到80%多
代码如下:

这里大多数都是mysql
单独看下mysql的cpu可以达到80%多
代码如下:
public void saveAllSaleDetail(List<?> list) throws Exception {
Map<String, SaleDetailEntity> saleDetails = new HashMap<String, SaleDetailEntity>();
int batchSize=1000,
threadCounts=10;
if(list.size() >= batchSize){
ExecutorService exec=Executors.newCachedThreadPool();
List<Callable<Map<String, SaleDetailEntity>>> callList=new ArrayList<Callable<Map<String, SaleDetailEntity>>>();
int len=list.size()/threadCounts;
if(len==0){
threadCounts=list.size();
len=list.size()/threadCounts;
}
for(int i=0;i<threadCounts;i++){
final List<SaleDetailEntity> subList;
if(i==threadCounts-1){
subList=(List<SaleDetailEntity>) list.subList(i*len,list.size());
}else{
subList=(List<SaleDetailEntity>) list.subList(i*len, len*(i+1)>list.size()?list.size():len*(i+1));
}
callList.add(new Callable<Map<String, SaleDetailEntity>>(){
@Override
public Map<String, SaleDetailEntity> call() throws Exception {
Map<String, SaleDetailEntity> saleDetails = new HashMap<String, SaleDetailEntity>();
for (SaleDetailEntity saleDetail : subList) {
SaleDetailEntity sale = new SaleDetailEntity();
sale.setOrgId(saleDetail.getOrgId());
sale.setOwnerId(saleDetail.getOwnerId());
sale.setProofId(saleDetail.getProofId());
sale.setProofLines(saleDetail.getProofLines());
List<SaleDetailEntity> saleDetailList = saleDetailDao.selectAllSaleDetailList(sale);
if (saleDetailList != null && saleDetailList.size() > 0) {
SaleDetailEntity saleDetailEntity = saleDetailList.get(0);
String id = saleDetailEntity.getId();
saleDetail.setId(id);
saleDetailDao.updateSaleDetail(saleDetail);
} else {
String uuid = RandomParamUtil.getUuid();
saleDetail.setId(uuid);
saleDetails.put(saleDetail.getProofId(), saleDetail);
}
}
return saleDetails;
}
});
}
List<Future<Map<String,SaleDetailEntity>>> invokeAll = exec.invokeAll(callList);
exec.shutdown();
for (Future<Map<String, SaleDetailEntity>> future : invokeAll) {
Map<String, SaleDetailEntity> map = future.get();
if(!map.isEmpty()){
saleDetailDao.insertAllSaleDetail(map);
}
}
}else{
for (Object object : list) {
SaleDetailEntity saleDetail = (SaleDetailEntity) object;
// 判断是否为重复数据,是直接修改
SaleDetailEntity sale = new SaleDetailEntity();
sale.setOrgId(saleDetail.getOrgId());
sale.setOwnerId(saleDetail.getOwnerId());
sale.setProofId(saleDetail.getProofId());
sale.setProofLines(saleDetail.getProofLines());
List<SaleDetailEntity> saleDetailList = saleDetailDao.selectAllSaleDetailList(sale);
if (saleDetailList != null && saleDetailList.size() > 0) {
SaleDetailEntity saleDetailEntity = saleDetailList.get(0);
String id = saleDetailEntity.getId();
saleDetail.setId(id);
saleDetailDao.updateSaleDetail(saleDetail);
} else {
String uuid = RandomParamUtil.getUuid();
saleDetail.setId(uuid);
saleDetails.put(saleDetail.getProofId(), saleDetail);
}
}
if (saleDetails != null && saleDetails.size() > 0) {
saleDetailDao.insertAllSaleDetail(saleDetails);
}
}
try {
//sendMCSP((List<SaleDetailEntity>)list);
} catch (Exception e) {
logger.error(e);
}
}
...全文
相关推荐
2021春招Redis高频面试题.pdf
Redis常见的性能问题都有哪些?如何解决?- **内存使用过高**:优化数据结构的选择,定期清理不必要的数据。- **CPU使用过高**:调整Redis配置参数,例如减少不必要的日志记录。
mysql占用CPU过高的解决办法(添加索引)
本文将深入探讨MySQL占用CPU过高的原因,并提供一个通过添加索引来解决问题的具体案例。首先,当MySQL服务器CPU使用率持续较高时,首要任务是定位问题的根源。
MongoDb CPU利用率过高问题如何解决
总之,解决 MongoDB 的 CPU 利用率过高问题,需要从代码、数据库设计和使用习惯等多方面入手,结合监控工具和最佳实践进行优化,以确保系统的高可用性和高性能。
MySQL数据库教程
- 提供丰富的编程接口,支持多种编程语言,如C/C++、C#、VB.NET、Java、Perl、PHP等。 - 多线程设计,有效利用CPU资源,支持多用户并发访问。
【MySQL面试第二弹】MySQL 服务占用cpu 100%,如何排查问题?
【MySQL面试第二弹】面试中遇到MySQL服务CPU占用100%的问题,是数据库性能优化领域常见的挑战。解决这个问题需要迅速而准确地定位问题根源。


高性能WEB开发
