20160512--hibernate--缓存
2016-05-15 19:21
330 查看
[b]缓存[/b]
缓存的作用主要用来提高性能,可以简单的理解成一个Map;使用缓存涉及到三个操作:把数据放入缓存、从缓存中获取数据、删除缓存中的无效数据。
原理模拟分析:(不能运行,只是模拟)(缓存实现复杂,hibernate运用了第三方框架实现)
一级缓存,Session级共享。
save,update,saveOrUpdate,load,get,list,iterate,lock这些方法都会将对象放在一级缓存中,一级缓存不能控制缓存的数量,所以要注意大批量操作数据时可能造成内存溢出;可以用evict,clear方法清除缓存中的内容。
二级缓存,SessionFactory级共享。
①实现为可插拔,通过修改cache.provider_class参数来改变;
hibernate内置了对EhCache,OSCache,TreeCache,SwarmCache的支持,可以通过实现CacheProvider和Cache接口来加入Hibernate不支持的缓存实现。
②在hibernate.cfg.xml中加入:
<class-cache class="className" usage="read-only"/>
或在映射文件的class元素加入子元素:
<cache usage="read-write"/>
其中usage:read-only,read-write,nonstrict-read-write,transactional
③Session的:save(这个方法不适合native生成方式的主键),
update,saveOrUpdate,list,iterator,get,load,以及Query,Criteria都会填充二级缓存,但只有(没打开查询缓存时)Session的iterator,get,load会从二级缓存中取数据(iterator可能存在N+1次查询)。
④Query,Criteria(查询缓存)由于命中率较低,所以hibernate缺省是关闭;修改cache.use_query_cache为true打开对查询的缓存,并且调用query.setCacheable(true)或criteria.setCacheable(true)。
⑤SessionFactory中提供了evictXXX()方法用来清除缓存中的内容。
⑥统计信息打开generate_statistics,用sessionFactory.getSatistics()获取统计信息。
分布式缓存和中央缓存。
使用缓存的条件
1.读取大于修改。
2.数据量不能超过内存容量。
3.对数据要有独享的控制。
4.可以容忍出现无效数据。
缓存的作用主要用来提高性能,可以简单的理解成一个Map;使用缓存涉及到三个操作:把数据放入缓存、从缓存中获取数据、删除缓存中的无效数据。
原理模拟分析:(不能运行,只是模拟)(缓存实现复杂,hibernate运用了第三方框架实现)
package com.dzq.test; import java.util.*; import com.dzq.domain.User; public class CacheDemo { private static Map cache = new HashMap(); public static void main(String[] args) { } public User queryUser(int id) { String key = User.class.getName() + id; User user = (User) cache.get(key); if (user != null) { return user; } user = getFormDB(); cache.put(key, user); return user; } public User updateUser(User user) { String key = User.class.getName()+user.getId(); updateDB(user); cache.remove(key); return user; } private void updateDB(User user) { // TODO Auto-generated method stub } private User getFormDB() { // TODO Auto-generated method stub return null; } }
一级缓存,Session级共享。
save,update,saveOrUpdate,load,get,list,iterate,lock这些方法都会将对象放在一级缓存中,一级缓存不能控制缓存的数量,所以要注意大批量操作数据时可能造成内存溢出;可以用evict,clear方法清除缓存中的内容。
二级缓存,SessionFactory级共享。
①实现为可插拔,通过修改cache.provider_class参数来改变;
hibernate内置了对EhCache,OSCache,TreeCache,SwarmCache的支持,可以通过实现CacheProvider和Cache接口来加入Hibernate不支持的缓存实现。
②在hibernate.cfg.xml中加入:
<class-cache class="className" usage="read-only"/>
或在映射文件的class元素加入子元素:
<cache usage="read-write"/>
其中usage:read-only,read-write,nonstrict-read-write,transactional
③Session的:save(这个方法不适合native生成方式的主键),
update,saveOrUpdate,list,iterator,get,load,以及Query,Criteria都会填充二级缓存,但只有(没打开查询缓存时)Session的iterator,get,load会从二级缓存中取数据(iterator可能存在N+1次查询)。
④Query,Criteria(查询缓存)由于命中率较低,所以hibernate缺省是关闭;修改cache.use_query_cache为true打开对查询的缓存,并且调用query.setCacheable(true)或criteria.setCacheable(true)。
⑤SessionFactory中提供了evictXXX()方法用来清除缓存中的内容。
⑥统计信息打开generate_statistics,用sessionFactory.getSatistics()获取统计信息。
分布式缓存和中央缓存。
使用缓存的条件
1.读取大于修改。
2.数据量不能超过内存容量。
3.对数据要有独享的控制。
4.可以容忍出现无效数据。
相关文章推荐
- uva Ugly Numbers
- chrono
- 通过修改flipwalls线路实现移动和联通全免流
- Linux(CentOS6.5)下Nginx注册系统服务(启动、停止、重启、重载等)&设置开机自启
- 高精度减法——一步一步算法篇
- Java核心之I/O;
- 在spark中使用Hive报错error: not found: value sqlContext
- 学习进度条——第11周
- 开挂的map
- How to Install JAVA 8 (JDK 8u91) on Ubuntu & LinuxMint via PPA
- VIM 的配置 .vimrc
- setter方法和getter方法
- Python OOP(面向对象编程)
- web前端题目集锦
- 基于MT7688模块的开发笔记13——给MT7688开发板添加tftp等功能
- 跟着郝斌学数据结构(05)——栈
- 仓位计算器
- linux安全---10大linux必备运维工具
- URAL - 1416 Confidential (最小生成树与次小生成树)
- 如何压缩PPT的容量?