解決sharding JDBC 不支持批量導(dǎo)入問(wèn)題
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語(yǔ)句批量更新
今天項(xiàng)目有個(gè)刷數(shù)據(jù)的需求,單條數(shù)據(jù)修改太慢,想著寫個(gè)批量update,三兩下把sql寫好了,發(fā)現(xiàn)分表不支持,sharding-jdbc只會(huì)把我第一個(gè)表名填充成正確表名,后面的表名都沒(méi)有修改。
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 = ? ;
由此可見(jiàn),這多條sql語(yǔ)句更新是不支持的。
修改思路
既然表名不支持自動(dòng)多個(gè),那我就自己替換表名,
先在代碼中根據(jù)表的分表規(guī)則得到表名,在賦值在每個(gè)sql語(yǔ)句上
代碼如下:
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>
這里需要注意一下:表名和列名需要用${}來(lái)傳入,參數(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 = ? ;
這樣便解決了批量更新問(wèn)題。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何用120行Java代碼寫一個(gè)自己的區(qū)塊鏈
這篇文章就是幫助你使用 Java 語(yǔ)言來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的區(qū)塊鏈,用不到 120 行代碼來(lái)揭示區(qū)塊鏈的原理,感興趣的就一起來(lái)了解一下2019-06-06
論java如何通過(guò)反射獲得方法真實(shí)參數(shù)名及擴(kuò)展研究
這篇文章主要為大家介紹了java如何通過(guò)反射獲得方法的真實(shí)參數(shù)名以及擴(kuò)展研究,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步早日升職加薪2022-01-01
SpringBoot整合SQLite數(shù)據(jù)庫(kù)全過(guò)程
sqlite是一個(gè)很輕量級(jí)的數(shù)據(jù)庫(kù),可以滿足日常sql的需求,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合SQLite數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03

