建議:如果對數據的準確性毋庸置疑的話就是用batch處理。如果不能確定準確性的話,如果對那條數據出錯無所謂的話就也可以用batch,但是非要返回出錯行號的話就不要用batch了,直接在外面套用一個事務,然后try catch一下,處理一下行號。 今天發生了ORA-01461 :can bind a LONG value only for insert into a LONG ...到處查詢發現是一個字段中的中文內容導致,仔細分析了一下原因,是因為jdk1.5的String類型為utf-16編碼方式,而jdk1.4為utf-8,通過在oracle網上查詢10g的jdbc驅動有兩個版本,舊版的不持jdk1.5,只支持jdk1.4,通過換jdbc驅動問題解決。 1、上回的心得中我強調了startBatch()的批處理的作用,但是其中的使用是個錯誤用法,并沒有發揮出startBatch()的實力,對此給與觀眾的誤導我將在此表示到欠,并貼出正確的用法



































2、注意ibatis的事物默認情況下是自動提交的,如果發現速度上有問題可以留意一下,ibatis只有在顯示的聲明事物管理的情況下才自動將事物管理改為不自動方式。
3、還是startBatch(),據我測試分析這個鬼東西只有在executeBatch(),才把所有的語句提交到數據庫,在提交之前緩存中保留了大量的sql語句和數據對象,很有可能out of memony,對此要留意,可以在大量數據要做插入時,分批用Batch,如:有40000條數據可將其分為4個Batch塊,讓后將這4個Batch用一個事物提交以保證數據完整性。
注:最近在做數據抽取項目,愿與大家溝通心得
程序功能:
使用ibatis+spring將oracle數據庫中的tfile表中的數據抽取到db2數據庫的tfile表,這兩個表的結構相同。
測試環境:
celeron M 1.4/512M/mysql 5.0數據庫
代碼:






































2、使用 test2FileDao.getSqlMapClient().startBatch();
test2FileDao.getSqlMapClient().executeBatch();
可以發起jdbc對批量數據插入的優化與自動代碼壓縮功能。
結語:這次使用ibatis在同樣的硬件、數據庫、數據條數的環境下測試,在不起用batch,所有數據庫,數據池特性均使用默認設置情況下使用19秒,并且使用一次性將數據讀入內存的方式,效果優于hibernate,所以真信優化后的程序應該比hibernate效率更高。但是從程序編寫方面來講,hibernate省去了過多的代碼,可以讓程序員更輕松些。
程序功能:
使用hibernate+spring將oracle數據庫中的tfile表中的數據抽取到db2數據庫的tfile表,這兩個表的結構相同。(原本要使用一些Spring的特性,但是程序改來改去發現Spring特性一個都沒用上,實際上完全可以由hibernate創建兩個sessionFactory完成)
測試環境:
celeron M 1.4/512M/mysql 5.0數據庫
代碼:





































配置文件:


1、為保證不會出現內存溢出
hibernate.jdbc.batch_size 設為 20-50
并在代碼中沒隔50個insert后手工清理數據








2、為保證減少二級緩存導致的過多的內存開銷關,閉二級緩存
hibernate.cache.use_second_level_cache 設為false
3、保證使用長事務,不要在每個插入都事務提交,這樣性能可以有很大幅度的提升(由于原先配的事務沒有正常運行,在初次測試時此程序插入4萬條數據用了12分鐘,使用了長事務后僅為34秒)
4、使用ScrollableResults(提供了數據庫的游標特性)然后插入的效果好像要優于分批抓取分批插入的效果,(4萬條數據,用ScrollableResult耗時29秒)但網上有人聲稱批量抓取插入的效果要好可能在遠程數據庫的情況下批量抓取的可靠性更高一點的原因。這一點我詢問過公司里做數據庫比較好的人,批量處理數據是要使用游標處理的。就游標而言分為動態游標,靜態游標,動態游標慢于靜態游標,靜態游標慢于靜態查詢,但是如果用分批抓取數據的話就涉及到數據分段截取,為保證每次分段截取時數據的正確性,應該要預先對數據處理,所以批量抽取數據的速度可能會慢一些。以下為使用ScrollableResult的程序






















| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
29 | 30 | 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 | 1 | 2 | |||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
常用鏈接
留言簿(2)
隨筆分類
隨筆檔案
- 2008年6月 (1)
- 2008年4月 (3)
- 2008年2月 (1)
- 2008年1月 (1)
- 2007年12月 (1)
- 2007年10月 (1)
- 2007年7月 (2)
- 2007年6月 (2)
- 2007年5月 (1)
- 2007年4月 (6)
- 2007年2月 (1)
- 2007年1月 (4)
- 2006年11月 (1)
- 2006年10月 (1)
- 2006年9月 (5)
framework
j2me
java
linux
web
其他
友情鏈接
- 我的旅游筆記
- 我的旅游筆記
素材
最新評論

- 1.?re: 為org.eclipse.jface.text.TextViewer添加undo、redo 并添加Ctrl+z,與Ctrl+y功能
- 找到原因了,必須加textViewer.setDocument(new Document());才好使
- --yumin_999@163.com
- 2.?re: 為org.eclipse.jface.text.TextViewer添加undo、redo 并添加Ctrl+z,與Ctrl+y功能
- 反復測試,還是不好使,奇怪。yumin_999@163.com
- --yumin_999@163.com
- 3.?re: ibatis批量代碼
- 這個能事物回滾嗎?我也是這樣子寫的 但是事物沒有回滾 不知道什么怎么回事
- --pes
- 4.?re: Spring+ibatis批量處理心得3
- 評論內容較長,點擊標題查看
- --孫繼超
- 5.?re: DB2的jdbc type-4驅動
-
您好 ,我也遇到了像您一樣的問題,我的qq是178147633,能幫幫我嗎?
我也是用type 4連接的db2,版本是8.2。到現在還沒連上 - --wk