Springboot配置多个数据源

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值