修改BusinessService.java文件如下所示:

  1. package com.hb3.pack_01;

  2. import org.hibernate.Session;
  3. import org.hibernate.SessionFactory;
  4. import org.hibernate.cfg.Configuration;

  5. import com.hb3.pack_01.model.User;

  6. public class BusinessService {

  7.     public static void main(String[] args) {
  8.         
  9.         Configuration config = new Configuration().configure();
  10.         SessionFactory sessionFactory = config.buildSessionFactory();      
  11.         Session session = sessionFactory.openSession();
  12.         
  13.         User user1 = (User) session.load(User.class, new Integer(1));
  14.         User user2 = (User) session.load(User.class, new Integer(1));
  15.         System.out.println(user1 == user2);
  16.         
  17.         user1 = (User) session.load(User.class, new Integer(1));
  18.         session.evict(user1);
  19.         user2 = (User) session.load(User.class, new Integer(1));
  20.         System.out.println(user1 == user2);

  21.         user1 = (User) session.load(User.class, new Integer(1));
  22.         session.clear();
  23.         user2 = (User) session.load(User.class, new Integer(1));
  24.         System.out.println(user1 == user2);
  25.         
  26.         Session session1 = sessionFactory.openSession(); 
  27.         user1 = (User) session1.load(User.class, new Integer(1)); 
  28.         session1.close(); 
  29.         Session session2 = sessionFactory.openSession(); 
  30.         user2 = (User)session2.load(User.class, new Integer(1)); 
  31.         session2.close();
  32.         System.out.println(user1 == user2);
  33.         
  34.         session.close();
  35.         sessionFactory.close();
  36.     }
  37. }

依次打印出的结果为

true
false
false
false

可见:

使用session.evict或者session.clear把某个物体从缓存中移除,或者直接关闭Session,都会使缓存失效,或者说释放缓存占用的资源空间。

值得一提的是:在载入大量数据时,应该及时手动清除一级缓存以释放资源。

例如:

  1. Session session = sessionFactory.openSession();
  2. Transaction tx = session.beginTransaction();

  3. while(....) { // 大量載入物件時的迴圈示意
  4.     ....
  5.     session.save(someObject);
  6.     if(count % 100 == 0) { // 每100筆資料
  7.         session.flush(); // 送入資料庫
  8.         session.clear(); // 清除快取
  9.     }
  10. }

  11. tx.commit();
  12. session.close();

在SQL Server、Oracle等数据库可使用hibernate的配置文件进行配置,如:

  1. ....
  2. <hibernate-configuration>
  3.     <session-factory>
  4.         ....
  5.         <property name="hibernate.jdbc.batch_size">100</property>
  6.         ....
  7.     </session-factory>
  8. <hibernate-configuration>

注意:在MySQL中不支持这种配置方式。



ExtJS教程- Hibernate教程-Struts2 教程-Lucene教程