在一般情况下,使用hibernate将500000条记录插入到数据库中,通常的做法是:
Java代码
Session session = sessionFactory.openSession();
Transaction tran = session.beginTransaction();
for(int i =0;i<500000;i++){
Customer custmoer = new Custormer(....);
session.save(custmoer);
}
tran.commit();
session.close();
Session session = sessionFactory.openSession();
Transaction tran = session.beginTransaction();
for(int i =0;i<500000;i++){
Customer custmoer = new Custormer(....);
session.save(custmoer);
}
tran.commit();
session.close();
通常执行结果会抛出内存溢出异常(OutOfMemoryException).
原因是因为实例在session级别的缓存区进行了缓存的缘故;
解决方法使用JDBC的批量(Batching)功能。使用JDBC的批量抓取数量(Batch Size)参数设置到一个合适值;
hibernate.jdbc.batch_size 20
如果要将很多对象持久化,必须经常flush()以及使用clear()来控制一级缓存的大小。如下
Java代码
Session session = sessionFactory.openSession();
Transaction tran = session.beginTransaction();
for(int i =0;i<500000;i++){
Customer custmoer = new Custormer(....);
session.save(custmoer);
if(i%20==0){
session.flush();
session.clear();
}
}
tran.commit();
session.close();
Session session = sessionFactory.openSession();
Transaction tran = session.beginTransaction();
for(int i =0;i<500000;i++){
Customer custmoer = new Custormer(....);
session.save(custmoer);
if(i%20==0){
session.flush();
session.clear();
}
}
tran.commit();
session.close();
在批量更新中也可以使用,此外在返回很多数据的查询时,需要使用scroll方法以便充分利用数据库的游标带来的好处。
如:
Java代码
Session session = sessionFactory.openSession();
Transaction tran = session.beginTransaction();
ScrollableResults customers = session.getNamedQuery("GetCustomers").setCacheMode(CacheModel.IGNORE).scroll(ScrollMode.FORWARD_ONLY);
int count = 0;
while(customers.next()){
Customer cust = (Customer )customers.get(0);
customer.update(...);
if(++count%20==0){
session.flush();
session.clear();
}
}
tran.commit();
session.close();
Java代码
Session session = sessionFactory.openSession();
Transaction tran = session.beginTransaction();
for(int i =0;i<500000;i++){
Customer custmoer = new Custormer(....);
session.save(custmoer);
}
tran.commit();
session.close();
Session session = sessionFactory.openSession();
Transaction tran = session.beginTransaction();
for(int i =0;i<500000;i++){
Customer custmoer = new Custormer(....);
session.save(custmoer);
}
tran.commit();
session.close();
通常执行结果会抛出内存溢出异常(OutOfMemoryException).
原因是因为实例在session级别的缓存区进行了缓存的缘故;
解决方法使用JDBC的批量(Batching)功能。使用JDBC的批量抓取数量(Batch Size)参数设置到一个合适值;
hibernate.jdbc.batch_size 20
如果要将很多对象持久化,必须经常flush()以及使用clear()来控制一级缓存的大小。如下
Java代码
Session session = sessionFactory.openSession();
Transaction tran = session.beginTransaction();
for(int i =0;i<500000;i++){
Customer custmoer = new Custormer(....);
session.save(custmoer);
if(i%20==0){
session.flush();
session.clear();
}
}
tran.commit();
session.close();
Session session = sessionFactory.openSession();
Transaction tran = session.beginTransaction();
for(int i =0;i<500000;i++){
Customer custmoer = new Custormer(....);
session.save(custmoer);
if(i%20==0){
session.flush();
session.clear();
}
}
tran.commit();
session.close();
在批量更新中也可以使用,此外在返回很多数据的查询时,需要使用scroll方法以便充分利用数据库的游标带来的好处。
如:
Java代码
Session session = sessionFactory.openSession();
Transaction tran = session.beginTransaction();
ScrollableResults customers = session.getNamedQuery("GetCustomers").setCacheMode(CacheModel.IGNORE).scroll(ScrollMode.FORWARD_ONLY);
int count = 0;
while(customers.next()){
Customer cust = (Customer )customers.get(0);
customer.update(...);
if(++count%20==0){
session.flush();
session.clear();
}
}
tran.commit();
session.close();