日期:2014-05-20  浏览次数:20669 次

新手问hibernate问题, 有点概念模糊
我是这样理解hibernate的:
  1. hibernate在用户代码和数据库中间插了一层,可以理解为缓存层, 也就是用户把提交的数据交给hibernate后, hibernate只是把数据放到缓存里, 等到合适的时候统一跟数据库同步, 这是不是就是hibernate能够很好的缓解数据库压力的解释?

  2. 比如A终端电脑提交了一组数据到hibernate, hibernate把这组数据放到缓存层, 那么B终端电脑向hibernate提取数据的时候,hibernate是不是从缓存层找, 如果没有找到这组数据, hibernate才会去和数据库里执行查找语句?

  3. 以上1 和 2理解都是正确的话, 那么hibernate.connection.autocommit = true 是不是就违背了hibernate当初设计的理念了?  

  4. 如果1 和2 都理解没有问题的话, 那么hibernate是在什么时候和数据库同步? 是不是要手动flush()?

请看例子:

小弟用myeclipse5 生成的hibernate代码。
   
  public interface IBaseHibernateDAO {
public Session getSession();
  }

   
  BaseHibernateDAO implements IBaseHibernateDAO{
  public Session getSession() {
return HibernateSessionFactory.getSession();
}
  }

  MessageDAO extends BaseHibernateDAO {
  save(Message instance){
  getSession().save(instance);
  ....
  }
   
  public List findByExample(Message instance) {
  List results = getSession()
  .createCriteria("com.hibernate.Message")
  .add(Example.create(instance))
  .list();
  ......
  }
  }  

   
   

   
  我在页面提交:
  Message message = new Message(); 这个
  message .setName("1111") 
  message .setValue("1111") .... 完成后, 

   
  调用DAO的save方法,
  MessageDAO md = new MessageDAO();
  md.save(message);

  我在数据库里面找不到这条记录, 那么是不是hibernate把这个message对象放在自己的缓存里了? 它会在什么时候跟数据库同步?
   

  如果是放在缓存里, 那么我在其他页面里面这样查找我刚才插入的数据:
  Message message = new Message();
  message .setName("1111");
  message .setValue("1111");

  MessageDAO md = new MessageDAO();
  List sss = md.findByExample(message );

  sss.size(); // 这里为0
   
  继续我的理解提出的疑问:

  1. hibernate 不是有缓存吗, 这时候调用findByExample()方法是不是从缓存里找, 但是为什么找不到呢?

  2. 如果save没有放到缓存里,我要 getSession().beginTransaction().commit();一下才能插入数据库, 那么hibernate的好处在哪, 还不是每次都要去操作数据库?





------解决方案--------------------
1,可以那么理解.
2,不太赞同. 以为Hiberrnate 提交的一组数据是保存在 它的session 缓存中. 这个缓存是没有是 Hibernate的一级缓存. 不可能被两个
终端(A,B) 共享 .B终端电脑一定会向数据库中去取记录. 

4,hibernate是在什么时候和数据库同步?
在hibernate清理缓存的时候和数据库同步. 详细参看: http://blog.csdn.net/caoyinghui1986/archive/2008/04/20/2308993.aspx
------解决方案--------------------
我理解缓存是赌缓存命中率的意思,不要直接去操作DB,把数据先load到内存中来
------解决方案--------------------
hibernate.connection.autocommit = true 只是为了消除Hibernate不能自动提交的局限性.
无论是否在事务中,一般情况下都是采用手动提交
Hibernate有两级缓存,默认情况下,二级缓存是需要手动开启的。只有当重复读取不常修改的数据时,为减小数据库压力,才将数据放入缓存中。
比如session.get()和session.load()从缓存和数据库中读取数据的顺序也有区别。详细请参考书籍。
缓存是Hibernate的核心,滥用乱用,只会适得其反。