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

MyBatis MapperProvider MessageFormat拼接批量SQL語句執(zhí)行報錯的原因分析及解決辦法

 更新時間:2016年01月18日 10:44:06   投稿:mrr  
這篇文章主要介紹了MyBatis MapperProvider MessageFormat拼接批量SQL語句執(zhí)行報錯的原因分析及解決辦法的相關(guān)資料,需要的朋友可以參考下

最近在項目中有這么一段代碼:下載服務(wù)器基礎(chǔ)業(yè)務(wù)數(shù)據(jù)進行本地批量插入操作,因項目中使用mybatis進行持久化操作,故直接考慮使用mybatis的批量插入功能。

1.以下是Mapper接口的部分代碼

public interface PrintMapper
{
@InsertProvider(type = PrintMapperProvider.class,method = "insertAllLotWithVehicleCode4H2") void insertAllLotWithVehicleCode(List<LotWithVehicleCodeBO> lotWithVehicleCodes);
}

2.對應(yīng)MapperProvider中函數(shù)片段

public String insertAllLotWithVehicleCode4H2(Map<String,List<LotWithVehicleCodeBO>> map)
{
List<LotWithVehicleCodeBO> lotWithVehicleCodeBOs = map.get("list");

StringBuilder sb = new StringBuilder("INSERT INTO MTC_LOT_WITH_VEHICLE_CODE (LOT_CODE,PRODUCT_VEHICLE_CODE) VALUES ");

MessageFormat messageFormat = new MessageFormat("(" +
"#'{'list[{0}].lotCode }," +
"#'{'list[{0}].productVehicleCode }" +
")"); int size = lotWithVehicleCodeBOs.size(); for (int i = 0; i < size; i++)
{
sb.append(messageFormat.format(new Object[]{i})); 
if (i < size - 1) sb.append(",");
} 
return sb.toString();
}

3.service層

@Transactionalpublic void synchLotWithVehicleCodeToLocalDB(List<LotWithVehicleCodeBO> lotWithVehicleCodeBOs)
{ if(null != lotWithVehicleCodeBOs && lotWithVehicleCodeBOs.size()>0)
{
printMapper.insertAllLotWithVehicleCode(lotWithVehicleCodeBOs);
}
}

程序上線的時候沒有發(fā)生問題,在業(yè)務(wù)量猛增的時候,大約同時執(zhí)行500條以上的時候程序就開始報錯:

Caused by: org.apache.ibatis.builder.BuilderException: Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}
at org.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.buildParameterMapping(SqlSourceBuilder.java:89)
at org.apache.ibatis.builder.SqlSourceBuilder$ParameterMappingTokenHandler.handleToken(SqlSourceBuilder.java:43)
at org.apache.ibatis.parsing.GenericTokenParser.parse(GenericTokenParser.java:25)
at org.apache.ibatis.builder.SqlSourceBuilder.parse(SqlSourceBuilder.java:24)
at org.apache.ibatis.builder.annotation.ProviderSqlSource.createSqlSource(ProviderSqlSource.java:57)
... 61 more

異常已指明SQL語句構(gòu)建問題,DEBUG進去:

問題根源:

MessageFormat messageFormat = new MessageFormat("(" +
"#'{'list[{0}].lotCode }," +
"#'{'list[{0}].productVehicleCode }," +
")");
int size = lotWithVehicleCodeBOs.size();
for (int i = 0; i < size; i++)
{
   sb.append(messageFormat.format(new Object[]{i})); 
  if (i<size-1) sb.append(",");
}

當size達到3位數(shù)以上時構(gòu)建出的message為:

(#{list[1,000].lotCode },#{list[1,000].productVehicleCode })

解決辦法:messageFormat.format(new Object[]{i+""}

相關(guān)文章

  • sql server 性能優(yōu)化之nolock

    sql server 性能優(yōu)化之nolock

    在SQL Server數(shù)據(jù)庫查詢時,為了提高查詢的性能,我們往往會在表后面加一個nolock,或者是with(nolock),讓數(shù)據(jù)庫在查詢時不鎖定表,從而提高查詢的速度,接下來,通過本篇文章給大家詳解sql server 性能優(yōu)化之nolock,需要的朋友快來學(xué)習(xí)吧。
    2015-08-08
  • SQL Server 2016 CTP2.3 的關(guān)鍵特性總結(jié)

    SQL Server 2016 CTP2.3 的關(guān)鍵特性總結(jié)

    SQL Server2016 CTP2.2是微軟數(shù)據(jù)平臺歷史上邁出最大的一步,更快的事務(wù)處理和查詢、任何設(shè)備更深入的洞察力、更先進的分析能力、全新安全技術(shù)和全新的混合云場景,本文給大家介紹SQL Server 2016 CTP2.3 的關(guān)鍵特性總結(jié),需要的朋友可以參考下
    2015-09-09
  • 一句Sql把縱向表轉(zhuǎn)為橫向表,并分別分組求平均和總平均值

    一句Sql把縱向表轉(zhuǎn)為橫向表,并分別分組求平均和總平均值

    一句Sql把縱向表轉(zhuǎn)為橫向表,并分別分組求平均和總平均值,需要的朋友可以參考下。
    2010-06-06
  • 使用linux?CentOS本地部署SQL?Server數(shù)據(jù)庫超詳細步驟

    使用linux?CentOS本地部署SQL?Server數(shù)據(jù)庫超詳細步驟

    作為一名Linux愛好者,我們在使用Linux系統(tǒng)的時候,經(jīng)常需要使用到數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于使用linux?CentOS本地部署SQL?Server數(shù)據(jù)庫的超詳細步驟,需要的朋友可以參考下
    2024-01-01
  • sqlserver中向表中插入多行數(shù)據(jù)的insert語句

    sqlserver中向表中插入多行數(shù)據(jù)的insert語句

    關(guān)于sql 2000中如何使用insert語句插入多行記錄,可是郁悶壞了我。
    2010-08-08
  • SQL Server數(shù)據(jù)庫bcp導(dǎo)出備份文件應(yīng)用示例

    SQL Server數(shù)據(jù)庫bcp導(dǎo)出備份文件應(yīng)用示例

    本節(jié)主要介紹了SQL Server數(shù)據(jù)庫bcp導(dǎo)出備份文件應(yīng)用,需要的朋友可以參考下
    2014-08-08
  • sql下三種批量插入數(shù)據(jù)的方法

    sql下三種批量插入數(shù)據(jù)的方法

    本文將介紹三種批量插入數(shù)據(jù)的方法,需要的朋友可以參考下
    2013-10-10
  • 詳解SQL游標的用法

    詳解SQL游標的用法

    這篇文章主要介紹了SQL游標的用法,文中講解非常詳細,配合代碼幫助大家更好的理解學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • SQL SERVER2012中新增函數(shù)之字符串函數(shù)CONCAT詳解

    SQL SERVER2012中新增函數(shù)之字符串函數(shù)CONCAT詳解

    SQL Server 2012有一個新函數(shù),就是CONCAT函數(shù),連接字符串非它莫屬。比如在它出現(xiàn)之前,連接字符串是使用"+"來連接,如遇上NULL,還得設(shè)置參數(shù)與配置,不然連接出來的結(jié)果將會是一個NULL。本文就介紹了關(guān)于SQL SERVER 2012中CONCAT函數(shù)的相關(guān)資料,需要的朋友可以參考。
    2017-03-03
  • sql 游標的使用—游標FOR循環(huán)小例子

    sql 游標的使用—游標FOR循環(huán)小例子

    游標for循環(huán)是在pl/sql塊中使用游標最簡單的方式,它簡化了對游標的處理。當使用游標for循環(huán)時,oracle會隱含的打開游標,提取游標數(shù)據(jù)并關(guān)閉游標。
    2013-05-05

最新評論