程序功能:使用ibatis+spring將oracle數(shù)據(jù)庫中的tfile表中的數(shù)據(jù)抽取到db2數(shù)據(jù)庫的tfile表,這兩個表的結(jié)構(gòu)相同。
測試環(huán)境:celeron M 1.4/512M/mysql 5.0數(shù)據(jù)庫代碼:
程序功能:使用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è)為false3、保證使用長事務(wù),不要在每個插入都事務(wù)提交,這樣性能可以有很大幅度的提升(由于原先配的事務(wù)沒有正常運行,在初次測試時此程序插入4萬條數(shù)據(jù)用了12分鐘,使用了長事務(wù)后僅為34秒)4、使用ScrollableResults(提供了數(shù)據(jù)庫的游標特性)然后插入的效果好像要優(yōu)于分批抓取分批插入的效果,(4萬條數(shù)據(jù),用ScrollableResult耗時29秒)但網(wǎng)上有人聲稱批量抓取插入的效果要好可能在遠程數(shù)據(jù)庫的情況下批量抓取的可靠性更高一點的原因。這一點我詢問過公司里做數(shù)據(jù)庫比較好的人,批量處理數(shù)據(jù)是要使用游標處理的。就游標而言分為動態(tài)游標,靜態(tài)游標,動態(tài)游標慢于靜態(tài)游標,靜態(tài)游標慢于靜態(tài)查詢,但是如果用分批抓取數(shù)據(jù)的話就涉及到數(shù)據(jù)分段截取,為保證每次分段截取時數(shù)據(jù)的正確性,應(yīng)該要預(yù)先對數(shù)據(jù)處理,所以批量抽取數(shù)據(jù)的速度可能會慢一些。以下為使用ScrollableResult的程序