一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 解決sharding JDBC 不支持批量導入問題

解決sharding JDBC 不支持批量導入問題

2022-03-06 13:13我&菜鳥 Java教程

這篇文章主要介紹了解決sharding JDBC 不支持批量導入問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

sharding JDBC 不支持批量導入

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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如下:

?
1
2
3
4
5
<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如下:

?
1
2
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語句上

代碼如下:

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

比如我這張表分了八個表,則按8取余這樣每個條數據都對應好了表名,

mybastis如下:

?
1
2
3
4
5
<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如下:

?
1
2
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 = ? ;

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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://www.cnblogs.com/xyj179/p/11454562.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女牲交毛片一级视频 | 久久99re8热在线播放 | 俄罗斯一级成人毛片 | 黑人粗长巨茎小说 | 色婷综合 | 四虎在线网址 | 99香蕉网| 国产成人无精品久久久 | 糖心视频在线观看 | 啊啊啊好大好爽视频 | 国产成人免费 | 国产精品边做边接电话在线观看 | 女人全身裸露无遮挡免费观看 | 深夜在线观看网站 | 日韩欧美亚洲每日更新网 | 极品久久| 欧美一区二区三区视视频 | 国产激情一区二区三区四区 | 亚洲精品福利一区二区在线观看 | 欧美视频在线播放观看免费福利资源 | 亚州性夜夜射在线观看 | 91中文字幕yellow字幕网 | 男人插曲女人下面 | 狠狠狠地啪香蕉 | 日韩亚洲国产欧美精品 | 手机看片1024国产 | 高h短篇校园1v1 | 免费网站直接进入 | 99年水嫩漂亮粉嫩在线播放 | 国产精品反差婊在线观看 | 国产手机在线αⅴ片无码观看 | 国产精品视频自拍 | 亚洲天天综合网 | 大陆男同志gayxxx | 国产高清精品自在久久 | 午夜福利电影网站鲁片大全 | 奇米网狠狠网 | 日韩无砖专区体验区 | 欧美老骚 | freesex1718处xx| 久久久精品日本一区二区三区 |