解決sharding JDBC 不支持批量導入問題
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寫好了,發(fā)現分表不支持,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語句更新是不支持的。
修改思路
既然表名不支持自動多個,那我就自己替換表名,
先在代碼中根據表的分表規(guī)則得到表名,在賦值在每個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 = ? ;
這樣便解決了批量更新問題。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringSecurity Oauth2訪問令牌續(xù)期問題
這篇文章主要介紹了SpringSecurity Oauth2訪問令牌續(xù)期問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04
java報錯之springboot3+vue2項目web服務層報錯總結
java入門學習,隨手記錄一下開發(fā)過程中產生的報錯,有些錯誤是網上搜索再加上自己嘗試,隨手引用了一些其他人的記錄,也是留給自己看的,或是希望能對其他初學者有幫助2023-06-06
Spring中@Repository注解的作用和用法以及和@Mapper的區(qū)別詳析
這篇文章主要給大家介紹了關于Spring中@Repository注解的作用和用法以及和@Mapper的區(qū)別的相關資料,注解的作用是標識一個類為數據訪問對象,并由Spring框架進行實例化和管理,需要的朋友可以參考下2023-09-09

