Springboot配置多个数据源
本周工作中,我遇到了一个需求,主要是读一个数据库的内容,并将读出来的数据写入到另一个数据库中。所以我总结了以下所遇到的问题。主要有:Springboot配置多个数据源、批量添加数据、以及传入字符串拼接表明、传图一个集合,每次只取一千个读取提升销量,以至于数据库不被读死。
配置多个数据源
下面说一下如何配置多个数据源的问题,我会将步骤以下图来标注说明。
如何改变文本的样式
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
下图是在application.yml文件下配置多个数据源的连接。这个项目我是配置了三个数据源,名字你可以自己起,见名知意就行。读写的需求我主要是配置了select以及inset这两个库。连接地址什么的你可以根据你的需求去变更。main是我之前做抓取配置的,那个不用管。
下图是配置config,具体是加载数据源,读取mapper文件的作用。这个是insert数据源的
下图配置的是selert的config,和上图基本一样,根据你所要执行的mapper去配置就行。
然后数据源就配置完成了,是不撒很简单。启动项目就可以了。具体根据你的需求,配置几个都行,原理都一样。
下面再说一下mybatis是如何做映射的。
我们之前学习的时候,肯定学过这个把,resultmap。就是将sql的字段与实体的属性一个个做映射。这么做的话会写起来很多,很麻烦。于是mybatis的配置文件加上一个注解,这个问题就解决了。会自动去映射对象。
下面再说一下批量添加的写法,其实跟根据多个id去查询差不多,写一个foreach即可。
下面展示一些 内联代码片
。
<insert id="insert">
insert into ${tableName}(<include refid="allColumn"/>)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.id}, #{item.code}, #{item.cateId}, #{item.brandId}, #{item.typeId}, #{item.supplierId}, #{item.supplierCommissionCateId}, #{item.name},
#{item.nameInitials}, #{item.subName},
#{item.subNameInitials}, #{item.mktPrice}, #{item.groupPrice}, #{item.purchasingPrice}, #{item.price}, #{item.tempPrice}, #{item.priceUnit}, #{item.unit},
#{item.groupNum},
#{item.note}, #{item.noteColor}, #{item.auditNote}, #{item.weight}, #{item.img}, #{item.publisher}, #{item.stockAmount}, #{item.saleAmount},
#{item.reviewCount}, #{item.reviewValidCount},
#{item.reviewAverage}, #{item.insaleStatus}, #{item.groupBuyStatus}, #{item.coinBuyStatus}, #{item.favorStatus}, #{item.giftStatus}, #{item.giftCoinStatus}, #{item.giftCoin}, #{item.coinBuyCoin},
#{item.auditStatus}, #{item.saleTime}, #{item.addTime}, #{item.intro}, #{item.alertAmount}, #{item.usableAmount}, #{item.noStock},
#{item.spec}, #{item.maker}, #{item.sort}, #{item.quotaAmount}, #{item.listShow}, #{item.groupCode}, #{item.hits}, #{item.site}, #{item.seoTitle}, #{item.seoKeyword},
#{item.seoDescription}, #{item.innovation},
#{item.packingList}, #{item.service}, #{item.salesByProxy}, #{item.shipper}, #{item.libraryId}, #{item.deliveryCycle}, #{item.trash}, #{item.stationId},
#{item.searchSyn},
#{item.hotSaleStatus}, #{item.coinCouponBuyType}, #{item.casCode}, #{item.freeDutyPrice}, #{item.bissnessType}, #{item.purchaserCode},
#{item.unSaleTime}, #{item.created}, #{item.modified},
#{item.videoPath}, #{item.videoBanner}, #{item.instructionsStatus})
</foreach>
</insert>
最后再附赠一个小方法把,很好用,实际就是比给你很多个id,你要去select * 一下。如果你都查出来的话性能会很低,实际中可能导致库的死锁问题。所以要做一下分页查询,即每次只查询一千,这样性能很高的。
将你查出来的id的集合传入方法中,每次取一千,方法附在下面了。
Collection<List<Long>> collections = subCollection(longs, 1000);
for (List<Long> collection : collections) {
//如果商品集合大于0,进行查询,并且添加
List<TblProductBasic> tblProductBasics = tblProductBasicSelectMapper.selectProduct(collection, "tbl_product_basic_" + i);
if (tblProductBasics.size()>0){
//批量添加1000条
tblProductBasicInsertMapper.insert(tblProductBasics,"tbl_product_"+brandId);
}
}
public static <T> Collection<List<T>> subCollection(Collection<T> collection , int maxNum){
Integer limit = countStep(collection.size(), maxNum);
Collection<List<T>> list = new ArrayList<>();
Stream.iterate(0, n->n+1).limit(limit).forEach(i->{
list.add(collection.stream().skip(i*maxNum).limit(maxNum).collect(Collectors.toList()));
});
return list;
}
public static Integer countStep(Integer size,Integer maxNum){
return (size + maxNum - 1) / maxNum;
}
}