程序功能:
使用ibatis+spring将oracle数据库中的tfile表中的数据抽取到db2数据库的tfile表,这两个表的结构相同。
测试环境:
celeron M 1.4/512M/mysql 5.0数据库
代码:public static void main(String[] args) {
// TODO Auto-generated method stub ClassPathResource resource = new ClassPathResource( "applicationContext.xml"); BeanFactory factory = new XmlBeanFactory(resource); TFileDAO tFileDao = (TFileDAO) factory.getBean("tfile"); TFileDAO test2FileDao = (TFileDAO) factory.getBean("test2tfile"); //获取全部数据 List list = tFileDao.getAll(); //开启事务 DataSourceTransactionManager txm = (DataSourceTransactionManager) factory .getBean("test2transactionManager"); DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus status = txm.getTransaction(def); try { test2FileDao.getSqlMapClient().startBatch(); for (int i = 0, count = list.size(); i < count; i++) { //插入数据 test2FileDao.insert((TFile) list.get(i)); } test2FileDao.getSqlMapClient().executeBatch();// 这两句有问题,请见Spring+ibatis心得2! } catch (Exception e) { txm.rollback(status); System.out.println(e); } txm.commit(status); System.out.println(list.size()); }
1、保证使用长事务,不要在每个插入都事务提交,这样性能可以有很大幅度的提升
2、使用 test2FileDao.getSqlMapClient().startBatch();
test2FileDao.getSqlMapClient().executeBatch();
可以发起jdbc对批量数据插入的优化与自动代码压缩功能。
结语:这次使用ibatis在同样的硬件、数据库、数据条数的环境下测试,在不起用batch,所有数据库,数据池特性均使用默认设置情况下使用19秒,并且使用一次性将数据读入内存的方式,效果优于hibernate,所以真信优化后的程序应该比hibernate效率更高。但是从程序编写方面来讲,hibernate省去了过多的代码,可以让程序员更轻松些。