__|Hibernate 的二级缓存|__
cfer 发表于 2013-6-7 0:26:00
按照以下思路来回答: (1)首先说清楚什么是缓存, (2)再说有了 hibernate 的 Session 就是 一级缓存,即有了一级缓存,为什么还要有二级缓存, (3)最后再说如何配置 Hibernate 的 二级缓存。 (1) 缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中 (一个数据结构中) , 这个数据结构通常是或类似 Hashmap, 当以后要使用某个对象时, 先查询缓存中是否有这个 对象, 如果有则使用缓存中的对象, 如果没有则去查询数据库, 并将查询出来的对象保存在 缓存中,以便下次使用。下面是缓存的伪代码: 引出 hibernate 的第二级缓存,用下面的伪代码分析了 Cache 的实现原理 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 从数据库中查询出一个对象时, Sessio n 也是先从自己内部查看是否存在这个对象, 存在则直接返回,不存在才去访问数据库,并将查询的结果保存在自己内部。由于 Sessio n 代表一次会话过程,一个 Session 与一个数据库连接相关连,所以 Session 最好不要长时间 保持打开,通常仅用于一个事务当中,在事务结束时就应关闭。并且 Session 是线程不安全 的, 被多个线程共享时容易出现问题。 通常只有那种全局意义上的缓存才是真正的缓存应用, 才有较大的缓存价值,因此,Hibernate 的 Session 这一级缓存的缓存作用并不明显,应用价 值不大。Hibernate 的二级缓存就是要为 Hibernate 配置一种全局缓存,让多个线程和多个事 务都可以共享这个缓存。我们希望的是一个人使用过,其他人也可以使用,session 没有这 种效果。 (3) 二级缓存是独立于 Hibernate 的软件部件, 属于第三方的产品, 多个厂商和组织都提供 有缓存产品,例如,EHCache 和 OSCache 等等。在 Hibernate 中使用二级缓存,首先就要在 hibernate.cfg.xml 配置文件中配置使用哪个厂家的缓存产品,接着需要配置该缓存产品自己 的配置文件,最后要配置 Hibernate 中的哪些实体对象要纳入到二级缓存的管理中。明白了 二级缓存原理和有了这个思路后,很容易配置起 Hibernate 的二级缓存。扩展知识:一 个 SessionFactory 可以关联一个二级缓存,也即一个二级缓存只能负责缓存一个数据库中的数 据,当使用 Hibernate 的二级缓存后,注意不要有其他的应用或 SessionFactory 来更改当前 数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致。
| |
http://cfer.tyblog.com/index.shtml
<< < 2013 - 6 > >>
日 |
一 |
二 |
三 |
四 |
五 |
六 |
|
|
|
|
|
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
|
|
|
|
|
|
 博客公告
| |
 最新发表
| |
 最近评论
| |
 最新留言
|
|
|
| |