目前在專案中發現一張700萬的表,插入10萬條資料通過mybatis的批量插入大概需要3分鐘左右,耗時太長。現在通過mysql的load data local infile 命令進行優化插入。最後測試10萬條資料批量插入大概在3秒左右的時間。
定義命令執行語句
public inte***ce fastbatchinsertsqlconstants
把物件轉換成對應格式的檔案流,並通過com.mysql.jdbc.preparedstatement去執行命令
public class fastbatchinsertutils
preparedstatement statement = conn.preparestatement(loaddatasql);
int result = 0;
com.mysql.jdbc.preparedstatement mysqlstatement = statement.unwrap(com.mysql.jdbc.preparedstatement.class);
mysqlstatement.setlocalinfileinputstream(datastream);
result = mysqlstatement.executeupdate();
} return result;
} public static inputstream getdatainputstreamforverifyorderpool(listverifyorderpoollist)
byte bytes = builder.tostring().getbytes();
inputstream is = new bytearrayinputstream(bytes);
return is;
} public static inputstream getdatainputstreamfororderpool(listorderpoollist)
byte bytes = builder.tostring().getbytes();
inputstream is = new bytearrayinputstream(bytes);
return is;
} public static inputstream getdatainputstreamformodifyanddelete(listmodifyanddeletelist)
byte bytes = builder.tostring().getbytes();
inputstream is = new bytearrayinputstream(bytes);
return is;
}
在專案裡進行呼叫,注意,如果要和其他更新資料庫的操作在同一事務中,應該使用帶事務的spring上下文中的資料庫連線
@transactional
public void newinsertbilldata(downrespvo result) throws exception
datasourcetransactionmanager transactionmanager = springcontextholder
.getbeanbyclass(datasourcetransactionmanager.class);
connectionholder connectionholder = (connectionholder) transactionsynchronizationmanager
.getresource(transactionmanager.getdatasource());// 返回事務物件
connection connection = connectionholder.getconnection();
// 注意不能用下面的獲取connection的方法,因為此方法獲取到的連線是新的連線,並不是執行緒上下文中的連線
// 需要自己手動進行事務管理
// connection connection= transactionmanager.getdatasource().getconnection();
// connection.setautocommit(false);
try else
if(collectionutils.isnotempty(totalcodelist)) else }}
long start = system.currenttimemillis();
// 對賬池入庫
long min = system.currenttimemillis();
if(collectionutils.isnotempty(verifyorderpoollist))
long end = system.currenttimemillis();
system.out.println("order耗時:"+(min-start)+"ms"+" pool耗時:"+(end-min)+"ms");
} catch (exception e)
}
MySQL大批量插入資料
1.對於myisam型別的表,可以通過以下方式快速的匯入大量的資料。alter table tblname disable keys loading the data alter table tblname enable keys 這兩個命令用來開啟或者關閉myisam表非唯一索引的更新。在匯入大量...
MySQL插入大批量測試資料
執行sql drop procedure if exists proc initdata 如果存在此儲存過程則刪掉 delimiter create procedure proc initdata begin declare i int default 1 while i 10000000 do 這...
Android資料庫大批量資料插入優化
對比在android中批量插入資料的3中方式對比 各插入1w條資料所花費的時間 1 乙個乙個插入 1 public static boolean insert sqliteopenhelper openhelper,4 returntrue 5 6 sqlitedatabase db null 7 ...