欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

解决sharding JDBC 不支持批量导入问题

时间:2022-05-05 10:20:17|栏目:JAVA代码|点击:

sharding JDBC 不支持批量导入

package com.ydmes.service.impl.log;
import com.ydmes.domain.entity.log.BarTraceBackLog;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import java.util.List;
@Component
public class BarTraceBackLogBatchServiceImpl implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public void batchInsertBarTraceBackLogs(List<BarTraceBackLog> barTraceBackLogs) {
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
definition.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
DataSourceTransactionManager transactionManager = (DataSourceTransactionManager)
applicationContext.getBean("shardingTransactitonManager");
TransactionStatus transactionStatus = transactionManager.getTransaction(definition);
for (BarTraceBackLog barTraceBackLog : barTraceBackLogs) {
//UserDao有create方法,单条插入
applicationContext.getBean(BarTraceBackLogServiceImpl.class).insertSelective(barTraceBackLog);
}
transactionManager.commit(transactionStatus);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}

sharding-jdbc不支持多条sql语句批量更新

今天项目有个刷数据的需求,单条数据修改太慢,想着写个批量update,三两下把sql写好了,发现分表不支持,sharding-jdbc只会把我第一个表名填充成正确表名,后面的表名都没有修改。

mybastis如下:

<update id="batchUpdate" >
<foreach collection="userList" item="item" index="index" separator=";">
update t_user_data set `province_id`=#{item.provinceId} where member_id = #{item.memberId}
</foreach>
</update>

sql如下:

update t_user_data_1 set `province_id`=?,`region_id`=? where member_id = ? ;
update t_user_data set `province_id`=?,`region_id`=? where member_id = ? ;

由此可见,这多条sql语句更新是不支持的。

修改思路

既然表名不支持自动多个,那我就自己替换表名,

先在代码中根据表的分表规则得到表名,在赋值在每个sql语句上

代码如下:

userData1.setTableName("t_user_data_" + userData.getMemberId() % 8);

比如我这张表分了八个表,则按8取余这样每个条数据都对应好了表名,

mybastis如下:

<update id="batchUpdate" >
<foreach collection="userList" item="item" index="index" separator=";">
update ${item.tableName} set `province_id`=#{item.provinceId} where member_id = #{item.memberId}
</foreach>
</update>

这里需要注意一下:表名和列名需要用${}来传入,参数才用#{}。

最终sql如下:

update t_user_data_1 set `province_id`=?,`region_id`=? where member_id = ? ;
update t_user_data_2 set `province_id`=?,`region_id`=? where member_id = ? ;

这样便解决了批量更新问题。

上一篇:配置SpringBoot方便的切换jar和war的方法示例

栏    目:JAVA代码

下一篇:Java图片批量压缩像素的实现方法

本文标题:解决sharding JDBC 不支持批量导入问题

本文地址:http://www.codeinn.net/misctech/201033.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有