背景是這樣的,在一次多個系統資料同步的時候,資料量較大,一次大概5000條,在同步的時候我採用的批量插入的方法,模擬測試沒問題,但是實際測試卻爆出了stackoverflowerror異常,於是乎,跟了一波**,
dao
void insertlist(listlistdata);
insert into t_sync(
id,code
)select items.* from
(select#,#
from dual
) items
在使用的過程中發現報錯
在這裡可以看出存在乙個遞迴的引用,所以當資料量過大的時候遞迴過深就會引起stackoverflowerror。
64位系統棧記憶體預設是1024kb(可以通過-xss設定棧記憶體大小)也就是1m,
在棧內每次呼叫方法都會產生乙個棧幀空間,壓入記憶體中,這個棧幀空間儲存著方法的引數、區域性變數、動態鏈結、方法出口等資訊,在深度遞迴中,大量棧幀壓入了棧記憶體且短時間無法得到釋放,1m的空間很快用完,導致stackoverflowerror。
那麼臨界值是究竟是多少呢?
這個臨界值明顯和棧幀空間所佔大小有很大的關係,所以我們得確定這個棧幀大小,棧幀的大小就關乎到我們所用到的引數以及區域性變數所佔空間的大小,所以準確的說是沒有明確的臨界值。
-xss
//分批插入,一次插入的大小
int limit = 500;
int listsize = userlist.size();
listnewlist = lists.newarraylist();
for (int i = 0; i < listsize; i++)
如有不正確的地方歡迎各位大佬指 mysql批量插入資料 MySQL中批量插入資料
例1 方法一 sql語句操作 delimiter 以delimiter來標記用 表示儲存過程結束 create procedure pre 建立pre 儲存方法 begin declare i int 定義i變數 set i 2 while i 53 do insert into lineinfo ...
mysql 迴圈插入 mysql 迴圈批量插入
背景 前幾天在mysql上做分頁時,看到有博文說使用 limit 0,10 方式分頁會有丟資料問題,有人又說不會,於是想自己測試一下。測試時沒有資料,便安裝了乙個mysql,建了張表,在建了個while迴圈批量插入10w條測試資料的時候,執行時間之長無法忍受,便查資料找批量插入優化方法,這裡做個筆記...
SQL語句 批量插入表 表資料插表
批量插入表 表資料插表 1.insert into select語句 語句形式為 insert into table2 field1,field2,select value1,value2,from table1 要求目標表table2必須存在,由於目標表table2已經存在,所以我們除了插入源表t...