新手问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的核心,滥用乱用,只会适得其反。