欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決sharding JDBC 不支持批量導(dǎo)入問題

 更新時(shí)間:2021年10月29日 14:52:42   作者:我&菜鳥  
這篇文章主要介紹了解決sharding JDBC 不支持批量導(dǎo)入問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

sharding JDBC 不支持批量導(dǎo)入

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語句批量更新

今天項(xiàng)目有個(gè)刷數(shù)據(jù)的需求,單條數(shù)據(jù)修改太慢,想著寫個(gè)批量update,三兩下把sql寫好了,發(fā)現(xiàn)分表不支持,sharding-jdbc只會(huì)把我第一個(gè)表名填充成正確表名,后面的表名都沒有修改。

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語句更新是不支持的。

修改思路

既然表名不支持自動(dòng)多個(gè),那我就自己替換表名,

先在代碼中根據(jù)表的分表規(guī)則得到表名,在賦值在每個(gè)sql語句上

代碼如下:

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

比如我這張表分了八個(gè)表,則按8取余這樣每個(gè)條數(shù)據(jù)都對(duì)應(yīng)好了表名,

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>

這里需要注意一下:表名和列名需要用${}來傳入,參數(shù)才用#{}。

最終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 = ? ;

這樣便解決了批量更新問題。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論