程序功能:
使用hibernate+spring將oracle數(shù)據(jù)庫中的tfile表中的數(shù)據(jù)抽取到db2數(shù)據(jù)庫的tfile表,這兩個表的結(jié)構(gòu)相同。(原本要使用一些Spring的特性,但是程序改來改去發(fā)現(xiàn)Spring特性一個都沒用上,實際上完全可以由hibernate創(chuàng)建兩個sessionFactory完成)
測試環(huán)境:
celeron M 1.4/512M/mysql 5.0數(shù)據(jù)庫
代碼:





































配置文件:


1、為保證不會出現(xiàn)內(nèi)存溢出
hibernate.jdbc.batch_size 設(shè)為 20-50
并在代碼中沒隔50個insert后手工清理數(shù)據(jù)








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





















