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