13.1. 批量插入(Batch inserts)如果要将很多对象持久化,你必须通过经常的调用 flush() 以及稍后调用 clear() 来控制第一级缓存的大小。
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.save(customer);
if ( i % 20 == 0 ) { //20, same as the JDBC batch size //20,与JDBC批量设置相同
//flush a batch of inserts and release memory:
//将本批插入的对象立即写入数据库并释放内存
session.flush();
session.clear();
}
}
tx.commit();
session.close();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.save(customer);
if ( i % 20 == 0 ) { //20, same as the JDBC batch size //20,与JDBC批量设置相同
//flush a batch of inserts and release memory:
//将本批插入的对象立即写入数据库并释放内存
session.flush();
session.clear();
}
}
tx.commit();
session.close();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
tx.commit();
session.close();这些操作我都不需要做的
return (Integer)super.getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session){
int rows = 0;
////////////////////////////
for(Customer c: clist)
{
session.save(customer);
rows++;
if ( rows % 20 == 0 ) { //20, same as the JDBC batch size //20,与JDBC批量设置相同
//flush a batch of inserts and release memory:
//将本批插入的对象立即写入数据库并释放内存
session.flush();
session.clear();
} // end of if
}//end of for
///////////////////////////
return new Integer(rows);
}
});
}
我程序改后如下:分布在14个文件系统里,有25万条数据,全部导到数据库里需要5分钟,是快还是慢? public void saveList(final List<T> list){
// return (Integer)
super.getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session){
int rows = 0; for(T t: list)
{
session.save(t);
rows++;
if ( rows % 10000 == 0 ) { //20, same as the JDBC batch size //20,与JDBC批量设置相同
//flush a batch of inserts and release memory:
//将本批插入的对象立即写入数据库并释放内存
session.flush();
session.clear();
}
} return new Integer(rows);
}
});
}