Hibernate一级缓存、二级缓存

摘要:
通常,只有全局意义上的缓存才是真正的缓存应用程序,并且具有很大的缓存价值。因此,Hibernate会话级缓存的缓存功能并不明显,几乎没有应用价值。Hibernate的第二级缓存是为Hibernate配置全局缓存,以便多个线程和事务可以共享缓存。在了解了二级缓存的原理并有了这个想法之后,很容易配置Hibernate的二级缓存。

缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中,准确说就是一个数据结构中,这个数据结构通常是或类似HashMap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。

1、缓存的伪代码:

DAO {
    HashMap map = new Map();
    User getUser(integer id) {
        User user = map.get(id)
        if(user == null) {
            user = session.get(id);
            map.put(id,user);
        }
        return user;
    }
}
DAO {
    Cache cache = null
    setCache(Cache cache) {
        this.cache = cache
    }
    User getUser(int id) {
        if(cache!=null) {
            User user = cache.get(id);
            if(user ==null) {
                user = session.get(id);
                cache.put(id,user);
            }
            return user;
        }
        return session.get(id);
    }
}

2、Hibernate的Session就是一种缓存,我们通常将之称为Hibernate的一级缓存,当想使用session从数据库中查询出一个对象时,Session也是先从自己内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在自己内部。由于Session代表一次会话过程一个Session与一个数据库连接相关连,所以Session最好不要长时间保持打开,通常仅用于一个事务当中,在事务结束时就应关闭。并且Session是线程不安全的,被多个线程共享时容易出现问题。通常只有那种全局意义上的缓存才是真正的缓存应用,才有较大的缓存价值,因此,Hibernate的Session这一级缓存的缓存作用并不明显,应用价值不大。Hibernate的二级缓存就是要为Hibernate配置一种全局缓存,让多个线程和多个事务都可以共享这个缓存。一个人使用过,其他人也可以使用,但是Session没有这种效果。

3、二级缓存是独立于Hibernate的软件部件,属于第三方的产品,多个厂商和组织都提供有缓存产品,例如,EHCache和OSCache等等。在Hibernate中使用二级缓存,首先就要在hibernate.cfg.xml配置文件中配置使用哪个厂家的缓存产品,接着需要配置该缓存产品自己的配置文件,最后要配置Hibernate中的哪些实体对象要纳入到二级缓存的管理中。明白了二级缓存原理和有了这个思路后,很容易配置起Hibernate的二级缓存。

扩展知识:一个SessionFactory可以关联一个二级缓存,也即一个二级缓存只能负责缓存一个数据库中的数据,当使用Hibernate 的二级缓存后,注意不要有其他的应用或SessionFactory来更改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致。 

免责声明:文章转载自《Hibernate一级缓存、二级缓存》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS中的成员变量,实例变量,属性变量HTML页面使用layer弹出框输入数据下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

资产管理 cmdb之ansible 获取服务器硬件、软件等信息

    cmdb抓取服务信息的方式有很多种,可以使用自动化工具saltstack、ansible、puppet,或者使用其它模块直接ssh远程连接抓取服务器信息。这里记录一下用ansible的API接口调用setup模块抓取。 实验使用两台机器 IP 系统 软件 192.168.93.137 centos6.5_x64 ansible 1.9.4...

Spring缓存注解@Cache使用

参考资料 http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ http://swiftlet.net/archives/774 缓存注解有以下三个: @Cacheable @CacheEvict @CachePut @Cacheable(value=”accountCach...

EF框架之三种模式

       使用EF之前必须要对EF有个宏观的了解.学习任何一种技术都要像门卫一样问几个问题.       第一,它是谁?       第二,从哪里来?       第三,到哪里去?        默念一遍:不谋全局者,不足谋一域.                      Entity Framework是ORMapping的一种具体实现,那ORMap...

MSSQL数据库各角色权限

固定数据库角色  描述  db_owner  在数据库中有全部权限。  db_accessadmin  可以添加或删除用户 ID。  db_securityadmin  可以管理全部权限、对象所有权、角色和角色成员资格。  db_ddladmin  可以发出 ALL DDL,但不能发出 GRANT、REVOKE 或 DENY 语句。  db_backup...

Springboot+ActiveMQ(ActiveMQ消息持久化,保证JMS的可靠性,消费者幂等性)

ActiveMQ 持久化设置: 在redis中提供了两种持久化机制:RDB和AOF 两种持久化方式,避免redis宕机以后,能数据恢复,所以持久化的功能 对高可用程序来说 很重要。 同样在ActiveMQ 中 也提供了持久化的功能,在生产者 生产消息 到队列中,可以通过设置 该消息在队列中是否持久化。持久化以后,即使ActiveMQ重启了,队列中的消息也不...

形象地理解Cookie和Session

Cookie和Session的形象理解 通过实际生活中的银行卡来理解Cookie和Session间的关系: Cookie相当于银行卡 Session相当于银行账户 结合到银行存钱和取钱的过程来理解: 存钱过程 1. 兴高采烈地到银行柜台,把要存的钱交给银行工作人员; 2. 银行工作人员把钱存好后,给你一张银行卡。 取钱过程 1. 需要用钱了,找到最近...