- 浏览: 938547 次
- 性别:
- 来自: 重庆
文章分类
- 全部博客 (453)
- Windows phone 7 (0)
- Andriod (47)
- iPhone (1)
- Web (30)
- J2EE (34)
- stucts 2学习笔记 (34)
- 开发项目 (3)
- spring学习笔记 (24)
- EJB学习笔记 (6)
- Hibernate学习笔记 (15)
- JPA学习笔记 (8)
- Jsp (11)
- ajax (7)
- 异常收集模块 (1)
- jquery (2)
- phoneGap (2)
- jquery Mobile (0)
- java面试总结 (5)
- Object-C (0)
- javascript (6)
- Eclipse (5)
- 支付集成 (2)
- Weblogic (1)
- Dubbox (5)
- Redis (10)
- linux (21)
- Codis (2)
- React Native (0)
- Mysql (6)
- Docker (3)
- 自动化部署 (1)
- 项目Bug管理平台 (2)
- 负载均衡 (1)
- Mycat (2)
- Java基础知识 (16)
- 数据库 (7)
- Maven (17)
- Kafka (21)
- logs (2)
- 大并发 (2)
- 消息中间件 (2)
- 分布式锁 (3)
- 算法 (4)
- 数字证书原理,公钥私钥 (0)
- 数字证书原理 (1)
- 公钥私钥 (1)
- zookeeper (4)
- Hbase (9)
- Hadoop (2)
- storm (2)
- 通信协议 (1)
- Hive (3)
- git (1)
- JVM (2)
- 大数据相关算法 (1)
- idea (5)
- 将博客搬至CSDN (1)
- 设计模式 (2)
- 表达式 (1)
- 代码审查工具 (0)
- 开源项目 (1)
- PyCharm (0)
- python (6)
- Kubernetes (1)
- swagger (1)
- Maven中mirrors和repository的关系 (0)
- RabbitMQ (3)
- redisson (1)
- k8s (2)
- Mac (1)
最新评论
-
misisipi101:
假设库已经分为32个,那么要扩展到64个,怎样做呢
订单分库分表实践总结以及关键步骤 -
mfkxk298:
简单明了的例子,解决了问题,谢谢啦!
关于ListView中notifyDataSetChanged()刷新数据不更新原因 -
whbwang:
" target="_blank" ...
java web开发 高并发处理 -
suguoqian:
...
java web开发 高并发处理 -
xiangnanyujing:
Dubbox+Redis3.0+Spring+Hibernate+zookeeper实现消息推送核心搭建
(一)hibernate数据缓存策略
缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的拷贝,位于数据库与数据访问层之间。对于查询操作相当频繁的系统(论坛,新闻发布等),良好的缓存机制显得尤为重要。
ORM在进行数据读取时,首先在缓存中查询,避免了数据库调用的性能开销。
ORM的数据缓存应包含下面几个层次:
1)事务级缓存 2)应用级缓存 3)分布式缓存
具体针对Hibernate而言,采用两级缓存策略,其过程描述:
(1)条件查询的时候,总是发出一条select * from table_name where …. 这样的SQL语句查询数据库,一次获得所有的数据对象。
(2) 把获得的所有数据对象根据ID放入到第二级缓存中。
(3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。
(4) 删除、更新、增加数据的时候,同时更新缓存。
1. 一级缓存(session level)-数据库事务级缓存
1)根据主键id加载数据时。 Session.load(), Session.iterate()方法
2)延迟加载时
Session内部维护一个数据对象集合,包括了本Session内选取的、操作的数据对象。这称为Session内部缓存,是Hibernate的第一级最快缓存,属于Hibernate的既定行为,不需要进行配置(也没有办法配置 :-)。
内部缓存正常情况下由hibernate自动维护,但也可人工干预:
1) Session.evict (): 将某个特定对象从内部缓存中清除
2)Session.clear(): 清空内部缓存
2.二级缓存(SessionFactory level)-应用级缓存
二级缓存由SessionFactory的所有session实例共享。
3. 第三方缓存实现
EHCache, OSCahe
hibernate批量查询引起的内存溢出问题
批量查询基本不适合使用现有的持久层技术来做,如CMP或hibernate,IBatis倒是可以.
因为每次调用Session.save()方法时,当前session都会将对象纳入到自身的内部缓存中。内部缓存不同于二级缓存,我们可以在二级缓存的配置中指定其最大容量。
解决方案:
1)在批处理情况下,关闭Hibernate缓存,如果关闭Hibernate缓存,那么和直接使用JDBC就没有区别。
2) 每隔一段时间清空Session内部缓存
Session实现了异步write-behind,它允许Hibernate显式地写操作的批处理。 这里,我给出Hibernate如何实现批量插入的方法: 首先,我们设置一个合理的JDBC批处理大小,hibernate.jdbc.batch_size 20。 然后在一定间隔对Session进行flush()和clear()。
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.save(customer);
if ( i % 20 == 0 ) {
//flush 插入数据和释放内存:
session.flush(); session.clear(); }
}
tx.commit();
session.close();
为了优化性能,可执行批量操作。在传统的JDBC编程中,批量操作方式如下,将数个SQL操作批量提交:
PrepareStatement ps=conn.prepareStatement("insert into users(name) values(?)");
for(int i=0;i<100000;i++){
ps.setString(1, "user"+i);
ps.addBatch();
}
int[] counts=ps.executeBatch
在Hibernate中,可以设置hibernate.jdbc.batch_size 参数来指定每次提交的sql数量。
hibernate2和hibernate3数据批量删除机制分析
1.hibernate2
Transaction tx=session.beginTransaction();
session.delete("from users");
tx.commit();
观察日志输出:
select ... from users
Hibernate:delete from users where id=?
Hibernate:delete from users where id=?
Hibernate:delete from users where id=?
...
hibernate2版本会首先从数据库中查询出所有符合条件的记录,再对此记录循环删除。如果记录量过大,势必引起内存溢出和删除效率问题。ORM为什么要这么做呢?因为ORM为了自动维护内存状态,必须知道用户到底对哪些数据进行了操作。问题的解决方法:
1)内存消耗
批量删除前首先从数据库中查询出所有符合条件的记录,如果数据量过大,就会导致 OutOfMemoryError.
可以采用Session .iterate或Query.iterate方法逐条获取记录,再执行delete操作。另外,hibernate2.16后的版本提供了基于游标的数据遍历操作:
Transaction tx=session.beginTransaction();
String hql="from users";
Query query=session.createQrery(hql);
ScrollableResults sr=query.scroll();
while(sr.next()){
TUser user=(TUser)sr.get(0);
session.delete();
}
tx.commit();
2)循环删除的效率问题
由于hibernate在批量删除操作过程中,需要反复调用delete SQL,存在性能问题。我们仍然可以通过调整hibernate.jdbc.batch_size参数来解决。
2.hibernate3
hibernate3 HQL中引入了 bulk delete/update操作, 即通过一条独立的sql语句来完成数据的批量操作。
Transaction tx=session.beginTransaction();
String hql="delete TUser";
Query query=session.createQrery(hql);
int count=query.executeUpdate();
tx.commit();
观察日志输出:
Hibernate:delete from TUser
(二)ibatis数据缓存
相对Hibernate 等封装较为严密的ORM 实现而言(因为对数据对象的操作实现了较为严密的封装,可以保证其作用范围内的缓存同步,而ibatis 提供的是半封闭的封装实现,因此对缓存的操作难以做到完全的自动化同步)。 ibatis 的缓存机制使用必须特别谨慎。特别是flushOnExecute 的设定(见“ibatis配置”一节中的相关内容),需要考虑到所有可能引起实际数据与缓存数据不符的操作。如本模块中其他Statement对数据的更新,其他模块对数据的更新,甚至第三方系统对数据的更新。否则,脏数据的出现将为系统的正常运行造成极大隐患。如果不能完全确定数据更新操作的波及范围,建议避免Cache的盲目使用。
1.iBatis cache设置
sqlmap-config.xml在<sqlMapConfig>里面加入
<settings
cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true" />
maps.xml在<sqlMap>里面加入
<cacheModel id="userCache" type="LRU" readonly="true" serialize="false">
<flushInterval hours="24"/>
<flushOnExecute statement="insertTest"/>
<property name="size" value="1000" />
</cacheModel>
可以看到,Cache有如下几个比较重要的属性:readOnly,serialize,type
readOnly
readOnly值的是缓存中的数据对象是否只读。这里的只读并不是意味着数据对象一
旦放入缓存中就无法再对数据进行修改。而是当数据对象发生变化的时候,如数据对
象的某个属性发生了变化,则此数据对象就将被从缓存中废除,下次需要重新从数据
库读取数据,构造新的数据对象。
serialize
如果需要全局的数据缓存,CacheModel的serialize属性必须被设为true。否则数据缓存只对当前Session(可简单理解为当前线程)有效,局部缓存对系统的整体性能提升有限。
Cache Type:
与hibernate类似,ibatis通过缓冲接口的插件式实现,提供了多种Cache的实现机制可供选择:
1. MEMORY
2. LRU
3. FIFO
4. OSCACHE
MEMORY类型Cache与WeakReference
MEMORY 类型的Cache 实现,实际上是通过Java 对象引用进行。ibatis 中,其实现类
为com.ibatis.db.sqlmap.cache.memory.MemoryCacheController,MemoryCacheController 内部,
使用一个HashMap来保存当前需要缓存的数据对象的引用。
LRU型Cache
当Cache达到预先设定的最大容量时,ibatis会按照“最少使用”原则将使用频率最少
的对象从缓冲中清除。可配置的参数有:
flushInterval:指定了多长时间清除缓存,上例中指定每24小时强行清空缓存区的所有内容。
size
FIFO型Cache
先进先出型缓存,最先放入Cache中的数据将被最先废除。
OSCache
(三)开源数据缓存策略OSCache
可以解决的问题:
1)信息系统中需要处理的基础数据的内容短时间内是不会发生变化的,但是在一个相对长一些的时间里,它却可能是动态增加或者减少的。
2)统计报表是一个周期性的工作,可能是半个月、一个月或者更长的时间才会需要更新一次,然而统计报表通常是图形显示或者是生成pdf、word、excel等格式的文件,这些图形内容、文件的生成通常需要消耗很多的系统资源,给系统运行造成很大的负担。
OSCache是OpenSymphony组织提供的一个J2EE架构中Web应用层的缓存技术实现组件。OSCache支持对部分页面内容或者对页面级的响应内容进行缓存,编程者可以根据不同的需求、不同的环境选择不同的缓存级别。可以使用内存、硬盘空间、同时使用内存和硬盘或者提供自己的其他资源(需要自己提供适配器)作为缓存区。
使用步骤:
1. 下载、解压缩OSCache
请到OSCache的主页http://www.opensymphony.com/oscache/download.html下载Oscache的最新版本,作者下载的是OSCache的最新稳定版本2.0。
将下载后的。Zip文件解压缩到c:\oscache(后面的章节中将使用%OSCache_Home%来表示这个目录)目录下
2. 新建立一个web应用
3. 将主要组件%OSCache_Home%\oscache.jar放入WEB-INF\lib目录
4. commons-logging.jar、commons-collections.jar的处理
OSCache组件用Jakarta Commons Logging来处理日志信息,所以需要commons-logging.jar的支持,请将%OSCache_Home%\lib\core\commons-logging.jar放入classpath(通常意味着将这个文件放入WEB-INF\lib目录)
如果使用JDK1.3,请将%OSCache_Home%\lib\core\commons-collections.jar放入classpath,如果使用JDK1.4或者以上版本,则不需要了
5. 将oscache.properties、oscache.tld放入WEB-INF\class目录
%OSCache_Home%\oscache.properties包含了对OSCache运行特征值的设置信息
%OSCache_Home%\oscache.tld包含了OSCache提供的标签库的定义内容
6. 修改web.xml文件
在web.xml文件中增加下面的内容,增加对OSCache提供的taglib的支持:
<taglib>
<taglib-uri>oscache</taglib-uri>
<taglib-location>/WEB-INF/classes/oscache.tld</taglib-location>
</taglib>
7.最简单的cache标签用法
使用默认的关键字来标识cache内容,超时时间是默认的3600秒
<cache:cache>
<%
//自己的JSP代码内容
%>
</cache:cache>
8. 缓存单个文件
在OSCache组件中提供了一个CacheFilter用于实现页面级的缓存,主要用于对web应用中的某些动态页面进行缓存,尤其是那些需要生成pdf格式文件/报表、图片文件等的页面,不仅减少了数据库的交互、减少数据库服务器的压力,而且对于减少web服务器的性能消耗有很显著的效果。
修改web.xml,增加如下内容,确定对/testContent.jsp页面进行缓存。
<filter>
<filter-name>CacheFilter</filter-name>
<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<!-对/testContent.jsp页面内容进行缓存-->
<url-pattern>/testContent.jsp</url-pattern>
</filter-mapping>
发表评论
-
CDN加速WordPress触发CORS导致跨域加载失败
2018-04-09 17:36 1569这两天折腾CDN加速来提升自己博客的访问速度,用的阿里云C ... -
PV模型
2017-02-05 18:05 720你想建设一个能承受500万PV/每天的网站吗? 500万PV ... -
App开发一些总结
2016-04-05 17:48 2598架构因人而异,不同的架构师大多会有不同的看法;架构也因项目 ... -
解决fastjson内存对象相互应用导入json字符串出现错误问题
2016-04-05 17:48 1538日常在使用FastJson的时候可能很少会 ... -
分布式配置统一管理平台-Windows
2016-02-02 14:10 2721这里主要使用到disconf分布式配置管理平台 支持wind ... -
Codis使用入门
2016-01-15 16:35 1728首先严重吐槽 在使用Coids遇到无数坑 坑 坑 ... ... -
高可用消息队列框架ZBUS
2016-01-13 10:47 5984我们在日常开发中可以需要用到消息队列 当然我们完全可以自己 ... -
实现消息推送核心搭建(升级版)
2016-01-08 15:43 1723前面已经实现了第一版 ... -
Dubbox+Redis3.0+Spring+Hibernate+zookeeper实现消息推送核心搭建
2015-12-30 15:55 10542这里在开始搭建环境之前请搭建先熟悉了解Dubbox、Red ... -
java 实现微信搜索附近人功能
2015-03-25 18:07 4931最近给andorid做后台查询数据功能,有一个需求是模仿微信 ... -
重庆APP开发 重庆Android 重庆Ios 爬虫科技 重庆爬虫科技
2014-10-06 12:03 9<!--[if gte mso 9]><x ... -
Javascript: unterminated string literal解决方法
2014-02-06 16:47 1973Javascript: unterminated strin ... -
身份证验证 80秒13亿数据校验
2014-01-15 13:41 9798/** * @Company asiainfo-linkag ... -
网页上播放视频的免费的播放器_CKPlayer
2013-12-12 14:17 2240今天在工作的过程中遇到一个功能:在网页中加入视频播放器 ... -
Ehcache 整合Spring 使用页面、对象缓存
2013-12-12 13:04 1291Ehcache 整合Spring 使用页面、对象缓存 E ... -
js 手机验证
2013-12-11 13:25 704** * 手机号:目前全国有27种手机号段。 * 移动有16 ... -
Freemarker使用
2013-12-04 16:57 1128以下内容全部是网上收 ... -
国内开源cms
2013-07-03 16:51 7http://www.jeecms.com/ -
FCkediter 整个struct2
2013-05-19 18:52 1401在这里总结一下今天使用Fckediter 和在整合Struct ... -
使用JSON-LIB转换JAVA对象
2013-03-17 17:42 1423使用JSON-LIB可以极大的简化JAVA对象转换成JSON对 ...
相关推荐
### Hibernate的缓存策略 #### 一、缓存的基本概念 缓存技术是现代软件架构设计中的重要组成部分,尤其在数据库交互频繁的应用场景下尤为重要。简单来说,缓存是一种存储技术,位于应用程序与物理数据之间,目的是...
总的来说,理解并合理运用Hibernate的缓存策略,能够显著提升应用性能,减少数据库的压力,但同时也需要考虑数据一致性及并发控制等问题。通过阅读源码,可以更深入地了解其内部机制,以便更好地进行性能调优。
### Hibernate缓存策略详解 #### 一、理解Hibernate缓存 ##### 1.1 缓存概念 在软件开发领域,缓存技术是一项重要的优化手段,它可以显著提高应用程序的性能和响应速度。Hibernate作为一种持久层框架,其核心功能...
Hibernate缓存机制是提高应用程序性能的关键特性,尤其是在频繁与数据库交互的应用中。缓存通过减少对物理数据库的直接访问次数,...正确理解和利用这些缓存策略,能够极大地提升基于Hibernate的应用程序的运行效率。
### Hibernate缓存技术研究 #### 一、引言 Hibernate是一种强大的对象-关系映射(Object-Relational Mapping,简称ORM...通过对缓存结构的理解以及合理配置缓存策略,可以有效地提高数据访问效率,减少数据库的负担。
本篇将详细探讨如何使用Hibernate ORM框架结合EhCache实现数据缓存的处理,从而提高系统的响应速度。 Hibernate是一个流行的Java持久化框架,它提供了一种便捷的方式来映射对象关系模型(ORM)到关系数据库。然而,...
Hibernate 缓存策略是优化应用程序性能的关键组成部分,尤其是在频繁访问数据库的情况下。...在实际开发中,开发者应根据具体业务场景,选择合适的数据缓存策略,确保性能优化的同时,兼顾数据的准确性和安全性。
根据业务需求,可以自定义缓存策略,为不同类型的对象设置不同的缓存过期时间。 **六、缓存同步** 为了保证多线程环境下的数据一致性,Hibernate提供了缓存同步机制,如LockMode和Locking Strategy。通过这些机制,...
综上所述,Hibernate缓存机制是提升应用性能的重要手段,通过合理配置缓存策略、优化查询方式、管理数据库连接以及实施有效的监控和调优措施,可以显著提高Hibernate应用的运行效率和用户体验。然而,缓存的使用并非...
缓存中存储的是数据库数据的副本,当需要查询数据时,Hibernate会首先在缓存中查找,如果找到,就直接返回,避免了数据库查询的开销。 **1. Hibernate缓存概述** Hibernate提供了两级缓存:一级缓存和二级缓存。一...
Ehcache.xml文件则用于详细配置缓存策略,如缓存区域、缓存策略(LRU、FIFO、SOFT References等)、缓存的存活时间等。 **最佳实践**: 1. 对于频繁读取但不经常修改的数据,适合放入缓存。 2. 考虑到数据一致性,...
缓存策略则决定了数据的过期策略,常见的有`READ_ONLY`(只读)、`READ_WRITE`(读写同步)和`NONSTRICT_READ_WRITE`(非严格读写)。 ### 6. 注意事项 - 数据一致性:二级缓存在更新时可能存在延迟,因此对于高...
1. **合理选择缓存策略**:根据数据的特点选择合适的缓存策略,如静态数据可以采用只读策略。 2. **调整缓存参数**:根据系统运行情况调整缓存的最大大小、过期时间等参数。 3. **利用批量处理**:通过设置`batch_...
使用`<cache usage="read-write">`配置,表示使用读写缓存策略,当实体被修改时,Hibernate会自动从缓存中移除相应数据。 Ehcache的配置通常在ehcache.xml文件中进行,如: ```xml maxElementsInMemory="500" ...
这里指定了`SysAppuser`实体采用只读缓存策略,即实体数据一旦被加载到缓存中就不会被修改。 #### 六、并发策略 在多线程环境中,缓存的一致性问题尤为重要。Hibernate提供了多种并发访问策略来解决这个问题,...
总结来说,这篇博客可能涵盖了如何在Hibernate项目中集成Ehcache,包括添加依赖、配置缓存策略、实体类缓存注解等步骤。了解和正确使用Hibernate与Ehcache的缓存机制,能够显著提升Java应用的性能,减少数据库压力,...
对于每个实体类,我们需要决定是否启用二级缓存以及使用哪种缓存策略。在实体类上添加`@Cacheable`注解,可以启用二级缓存。同时,可以通过`@Cache`注解设置缓存策略,例如: ```java @Entity @Cacheable(true) @...