1.批量操作
防止批量操作時記憶體溢位的方法
使用Session的flush/clear方法
使用StatelessSession介面
程式例子:
package com.etc.po;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.StatelessSession;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.etc.po.util.HibernateSessionFactory;
public class TestBatch {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Session session=HibernateSessionFactory.getSession();
Transaction tran=session.beginTransaction();
for(int i=7;i<200003;i++){
session.save(new Person(i,"Name"+i,23));
if ( i % 20 == 0 ) {
session.flush();
session.clear();
}
}
tran.commit();
//Configuration conf=new Configuration().configure();
//SessionFactory factory=conf.buildSessionFactory();
//StatelessSession session=factory.openStatelessSession();
//Transaction tran=session.beginTransaction();
//for(int i=3;i<200003;i++){
//session.insert(new Person(i,"Name"+i,23));
//}
//tran.commit();
//String hql1="from Person p";
//Session session=HibernateSessionFactory.getSession();
//
//Transaction tran=session.beginTransaction();
//List
//for(Person p:list){
//System.out.println(p.getId()+" "+p.getName());
//}
//tran.commit();
}
}
2.延遲載入
當某例項有關聯例項時,Hibernate中預設使用延遲載入。即預設情況下,不查詢關聯例項可以配置lazy=“false” ,取消延遲載入實際應用中,往往都使用延遲載入,以保證效能
package com.etc.po;
import java.util.List;
import java.util.Set;
import org.hibernate.Session;
import com.etc.po.util.HibernateSessionFactory;
public class TestLazy {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Session session=HibernateSessionFactory.getSession();
String hql1="from Person p";
List
//for(Person p:list){
//System.out.println(p.getName());
//}
//Person p=(Person)session.get(Person.class, 1);
//Set
set=p.getAddresses();//for(Address a:set){
//System.out.println(a.getDetail());
//}
}
}
3.batch-size屬性
“N+1查詢問題”中,當N值較大時,將降低效能batch-size屬性可以定義批量處理的實體個數batch-size的值建議在5-30之間batch-size屬性減少查詢語句條數,從而提高效能
package com.etc.po;
import java.util.List;
import org.hibernate.Session;
import com.etc.po.util.HibernateSessionFactory;
public class TestN {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Session session=HibernateSessionFactory.getSession();
String hql1="select p,addresses from Person p join p.addresses addresses";
String hql2="select p,address from Address address,Person p where address in elements(p.addresses) ";
String hql3="from Person p left join fetch p.addresses addresses";
List
for(Person p:list){
System.out.println(p.getId());
}
//List
//
//for(Object[] obj:list){
//Person per=(Person)obj[0];
//Address addr=(Address)obj[1];
//System.out.println(per.getId()+" "+addr.getDetail());
//}
}
}