先后遇到的問題:
1.插入速度太慢
2.Excel的數據太臟,同一列中混合有許多不同類型的值(日期,整數,浮點數)
3.字符集導致的字段太長問題(Data too long for column Data too long for column) [整了我一天,那一天就算我睡了個飽心情美汁汁,一看到這個問題還是會讓我眉頭緊皺]
4.Table is full,小破阿里雲服務器沒空間了
解決過程:
1.插入速度太慢:
如果是一條條的簡單插入,兩分鍾才插入1k+條,實在是太慢了。於是上網查了一些方法。
1.改用 PreparedStatement來批插入, 也就是 用 insert into table (a,b,c,d,e,......) values( ?, ? , ? ,......) 的方法去插入
每用 setObject 設置完一個 括號 : () 里的值就 addBatch, 最后 executeBatch , 但實際上還是很慢,和之前沒什么區別,或許是我用的方法有問題,具體為什么還要去研究下Mysql的實現
2.改用另一種批插入方法:多值插入
也就是把 sql 語句寫成 insert into table (a,b,c,d,e,......) values (x,y,z,...), (x1,y1,z1,...), (..,..,..,...), (..,..,..,...), (..,..,..,...), (..,..,..,...)......
用的不是PreparedStatement ,而是普通 statement 的 execute,有明顯的效果,原本要十幾分鍾來插入的 8m的excel,只用十幾秒就可以插入到數據庫
2.編碼問題
但是隨之而來發生的是 Data too long for column Data too long for column 的錯誤,困擾了我許久,我的列明明長度管夠,為什么還報錯?
按照網上的方法試了許久,還是不行,於是在想是不是和 PreparedStatement 和 Statement 的區別。
最后改用 PreparedStatement , 還是用多值插入 insert into table (a,b,c,d,e,......) values (?,?,?,...), (?,?,?,...), (?,?,?,...), (?,?,?,...), (?,?,?,...), (?,?,?,...)......
實現起來比較復雜,但是試了許久還是有問題,於是把數據庫表中 對應列的 編碼改成 utf8,並且適當增長長度,最后成功,具體為什么可能要日后查看實現才能知道
后來又用舊的代碼,也就是之前普通statement的語句測試了一下,數據插入成功,可以斷定是列的編碼不正確,應該選用 utf8
3.數據太臟
知道表的格式,把表頭及其對應的類型(按照表頭的下一行判斷,可能表頭的下一列是空的,或者下一列本身不正確,不正確概率比較小,我業務的臟數據一般出現在中后部分),讀取出來,建立 表明 - 列類型集合 的映射,如果讀進來的值不符合類型,則直接跳過該行,問題解決