- 浏览: 1197417 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (361)
- java综合 (33)
- 项目管理 (10)
- 工作流 (6)
- spring (11)
- hibenate (17)
- struts (0)
- javascript,html,css,ajax,jquery (11)
- IDE (9)
- 生活 (0)
- 工作 (0)
- 杂记 (1)
- 数据库 (96)
- 服务器 (5)
- 可视编辑 (0)
- freemarker (6)
- 操作系统 windows (13)
- web页面 (6)
- jms (15)
- 调优 (4)
- 测试和bug管理 (2)
- 原理 (1)
- 項目-atf (17)
- 安全 (3)
- xml (4)
- 操作系统 liunx (21)
- 网络 (22)
- office (11)
- 设计 (2)
- 软件 (1)
- 数据库 mysql (6)
- 胖客户端-flex (1)
- 正则 (9)
- oracle- liunx (3)
- sql2000 (2)
- 模式 (1)
- 虚拟机 (2)
- jstl (2)
- 版本控制 打包工具 (0)
- AOP (1)
- demo (1)
- 小软件 (2)
- 感恩 (1)
- iphone 4 (1)
- 反欺诈业务经验整理 (0)
最新评论
-
sea0108:
mark
java内存模型 -
XingShiYiShi:
方便把:testPNR();具体实现发出来吗?谢谢
用正则表达式解析 航信的电子客票和pnr报文 -
wh359126613:
如果js和webservice不在同一个服务器上,有跨域问题如 ...
使用javascript调用webservice示例 -
雨飛雁舞:
...
oracle 动态性能(V$)视图 -
ouyang1224:
好东西
oracle 动态性能(V$)视图
1启用Hibernate二级缓存
Hibernate二级缓存分为两部分,class缓存和查询缓存,其获取对象的方式有所不同,但两者也有联系,查询缓存必须以class缓存为基础才能起作用,否则只会使效率更低。
我们这里使用的二级缓存是通过ehcache第三方插件实现的。
1.1配置Hibernate.cfg.xml
启用class缓存:
<property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
启用查询缓存:
<property name="hibernate.cache.use_query_cache">true</property>
1.2配置Spring框架中的hibernate
启用class缓存:
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
启用查询缓存:
<prop key="hibernate.cache.use_query_cache">true</prop>
1.3配置ehcache
Ehcache配置文件为ehcache.xml,默认配置为:
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="1800"
timeToLiveSeconds="1800"
overflowToDisk="true"
/>
</ehcache>
其中各项内容的含义为:
1 diskStore:代表当二级缓存对象数据在内存中溢出,如果需要写入文件系统时的文件目录。
2 defaultCache:默认的calss缓存配置,如果某个对象没有其专有的配置时,ehcache一律启用默认配置。
3 maxElementInMemory:对象在内存中可存放的最大数量。
4 eternal:表示对象永不过期,如果选true则5,6两项无效。
5 timeToIdleSeconds:对象的空闲状态过期时间,单位为秒,0为可以无限制空闲。
6 timeToLiveSeconds:对象存在的最长时间,单位为秒(注意,如果该项比5项要小,则第5项无意义),0为永不过期。
7 overflowToDisk:当对象在内存中的数量超过maxElementInMemory值时,如果该项为true,则ehcahe会把对象数据写入diskStore项指定的目录。
如果需要对某个具体对象进行单独配置时,可以加上一组cache配置,例如:
<cache name="com.juyee.mp.bean.SysCodelist"
maxElementsInMemory="10000"
eternal="true"
timeToIdleSeconds="1800"
timeToLiveSeconds="0"
overflowToDisk="true"
/>
另外还有两个特殊的cache配置:
<cache name="org.hibernate.cache.UpdateTimestampsCache"
maxElementsInMemory="5000"
eternal="true"
timeToIdleSeconds="1800"
timeToLiveSeconds="0"
overflowToDisk="true"/>
<cache name="org.hibernate.cache.StandardQueryCache"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="1800"
timeToLiveSeconds="0"
overflowToDisk="true"/>
这两个cache配置对应查询缓存,具体作用如下(摘用别人的描述):
“当hibernate更新数据库的时候,它怎么知道更新哪些查询缓存呢? hibernate在一个地方维护每个表的最后更新时间,其实也就是放在上面UpdateTimestampsCache所指定的缓存配置里面。
当通过hibernate更新的时候,hibernate会知道这次更新影响了哪些表。然后它更新这些表的最后更新时间。每个缓存都有一个生成时间和这个缓存所查询的表,当hibernate查询一个缓存是否存在的时候,如果缓存存在,它还要取出缓存的生成时间和这个缓存所查询的表,然后去查找这些表的最后更新时间,如果有一个表在生成时间后更新过了,那么这个缓存是无效的。
可以看出,只要更新过一个表,那么凡是涉及到这个表的查询缓存就失效了,因此查询缓存的命中率可能会比较低。”
当然,如果没有这两个配置,则ehcache将为查询缓存启用默认配置。
2如何使用class缓存
2.1对象缓存
Class缓存的作用主要是在内存中保存某个具体对象,当用户第一次通过get、iterator方式取出对象时,系统会先从class缓存中去找,如果没有再通过sql语句去数据库中查找相关记录,并将查询到的对象放入内存中。
实例:对某个对象使用二级缓存,只需要在该对象的hbm文件中配置即可
<cache usage="read-write"/>
我们注意到其中usage这个选项,它有多个选择,对应不同的含义,经常有这两种种:
1 read-only:只对缓存中的对象进行读操作。
2 read-write:当对象被update时,缓存中和数据库中一同被修改(缓存不支持事务回滚)。
2.2关联缓存
目前我们仅仅实现了对一个对象的缓存,那如何对该对象的关联对象集合进行缓存呢?
实例:对某个对象的关联对象集合的二级缓存,需要在该对象的hbm文件中set配置进行修改
<set name="children" lazy="true" order-by="treeid asc">
<cache usage="read-write"/>
<key column="PARENTID"/>
<one-to-many class="SysCodelist"/>
</set>
注意:
1 只对one-to-many有效,而且仅仅缓存的是关联对象的id集合,如果需要实现完全缓存,则需要对关联的对象也配置成使用二级缓存。
2 集合缓存是独立的,不受关联对象添加、删除的影响,如果要修改集合内容,必须对这个集合本身进行修改,例如:codelist.getChildren().add()。
3如何使用查询缓存
查询缓存,目的是为了将通过list()方法的查询结果存入缓存中,并实现对语句的缓存,如果下次用户在使用这条语句进行查询时,将直接从缓存中获取对象数据。
这里要注意的是,查询缓存必须配合class缓存使用,如果只启用查询缓存,不对查询对象启用二级缓存,则会大大降低查询效率。
因为,当第一次通过启用查询缓存的session进行语句查询时,系统只执行一次数据库查询将所有的记录取出,并将对象存入class缓存,语句及id集合存入查询缓存;而当用户第二次查询该语句时,系统将先执行去查询缓存中查找,取出所有符合条件的id集合,如果这时候该对象的class缓存没启用或在class缓存中已过期,系统将根据id,一个个去数据库load,实际上是进行了1+N次查询。
实际上,在我们系统中,并不是对所有对象都要进行二级缓存,而spring框架中提供的hibernate方法,虽然有getHibernateTemplate().setCacheQueries(),但该方法影响的是全局的配置,一旦启用,将会对不需要缓存的查询造成不良影响。
于是,我自己在hibernateService()中添加了一个方法:
public List findByCachedQuery(final String hql)
{
return (List) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Query queryObject = session.createQuery(hql);
queryObject.setCacheable(true);
if (getHibernateTemplate().getQueryCacheRegion() != null) {
queryObject.setCacheRegion(getHibernateTemplate().getQueryCacheRegion());
}
return queryObject.list();
}
}, true);
}
这样,将只在session范围内启用查询缓存,一旦该session结束了,那么查询缓存也将回复默认配置。
注意:使用时只支持hql。
4注意事项
在使用二级缓存时,注意,所有对数据库的修改都必须走hibernate,如果从其他系统来或使用sql语句来修改数据库相关记录,那么将对二级缓存的数据不会造成影响,换句话说,缓存中的对象数据将和数据库中的不一致。
发表评论
-
Hibernate的拦截器和监听器
2009-11-02 14:13 2104最近项目需要,用到了Hibernate的拦截器和监听器,有些小 ... -
深入 理解 Statement 和 PreparedStatement
2009-07-20 10:26 2435翻译:陈先波(turbochen@163.com)阅读原文:h ... -
开发者请注意oracle jdbc的resultSet.last()方法的效率问题
2009-07-20 10:20 2770在使用Hibernate分页器时 ... -
深入理解JDBC Scrollable ResultSet
2009-07-20 10:06 3935JDBC2.0后提出了三种不 ... -
hibernate ScrollableResults 中CacheMode 和 ScrollMode 介绍
2009-07-20 09:26 2608CacheMode.GET - 从二级缓存中读取数据,仅在数 ... -
Hibernate中Criteria的完整用法
2009-06-21 20:13 1201Hibernate中Criteria的完整用法2008年07 ... -
Hibernate 深入研究之 Criteria
2009-06-21 17:02 1526最近在项目中使用 Spring 和 Hibernate 进行 ... -
Hibernate3的DetachedCriteria支持
2009-06-20 19:07 2769Hibernate3支持DetachedCriteria,这是 ... -
Hibernate Annotation几种关联映射
2009-04-26 02:10 1842Hibernate Annotation几种关联映射 一对一 ... -
HibernateTemplate中HibernateCallback的事务
2009-03-08 03:41 2352目的:使用HibernateTemplate执行execute ... -
关于hibernate的缓存和CRUD
2009-03-08 02:05 1125hibernate作为一种现在 ... -
EJB3/JPA Annotations 学习
2009-03-07 15:43 2415Document file and example: Hibe ... -
java回调机制及Hibernate中的HibernateTemplate实现
2009-03-06 20:42 2008谈谈回调吧,以前学java的时候居然没接触到这个词汇,汗,最近 ... -
hibernate大对象类型映射
2009-02-02 23:28 1804hibernate大对象类型映射 ... -
Hibernate 多对多单向关联
2009-02-02 02:17 1546Hibernate 多对多单向关联 一、模型介绍 多个人 ... -
Hibernate对应关系详解
2009-02-02 02:15 1190many-to-one节点有以下属性(摘自Hibernate文 ...
相关推荐
通过本次实验,不仅深入了解了Hibernate二级缓存的基本概念和工作原理,还掌握了如何通过配置来优化二级缓存的使用。实践证明,合理的缓存策略能够显著提升系统的性能表现。在实际开发过程中,还需要结合具体的应用...
7. **缓存机制**:为了提高性能,Hibernate提供了第一级缓存和第二级缓存。手册会讲解它们的工作原理,以及如何配置和使用缓存。 8. **性能优化**:手册还将提供关于Hibernate性能优化的建议,如批处理操作、延迟...
另外,手册还会涵盖性能优化和最佳实践,如缓存使用(一级缓存和二级缓存)、批处理操作、延迟加载的控制以及如何避免N+1查询问题等。最后,可能会包含一些实战案例,帮助读者将理论知识应用到实际项目中。 总之,...
9. **Caching**:Hibernate支持二级缓存,可以使用第三方缓存如 EhCache 提高性能。 10. **事务处理**:Hibernate支持JTA和JDBC两种事务处理方式,保证数据的一致性和完整性。 11. **关联映射**:包括一对一、一对...
- **缓存机制**:介绍 Hibernate 的一级缓存和二级缓存,提高应用性能。 - **事务管理**:如何利用 Hibernate 进行事务的管理。 - **批量更新**:介绍如何优化大量的数据更新操作。 #### 八、扩展与插件 - **拦截...
- 第二级缓存:SessionFactory级别的缓存,可配置第三方缓存实现,如EhCache。 - 查询缓存:缓存查询结果,提高效率。 9. **实体状态与生命周期** - 新建(Transient)、持久化(Persistent)、游离(Detached)...
- Hibernate 支持一级缓存和二级缓存,可以有效提高应用程序性能。 - 一级缓存是 `Session` 范围内的缓存,默认开启。 - 二级缓存需要额外配置启用,适用于多个 `Session` 共享数据的情况。 2. **懒加载**: - ...
10. **缓存策略**:Hibernate支持第二级缓存和查询缓存,以提高性能。了解如何配置和使用缓存可以显著提升应用程序的响应速度。 11. **事务管理**:Hibernate支持JTA和JPA的事务管理,通过SessionFactory的...
Hibernate提供了二级缓存机制,可以使用第三方缓存服务如Ehcache,提高数据读取速度,减少对数据库的压力。 11. **事件和拦截器** Hibernate允许注册事件监听器和拦截器,对特定的生命周期事件(如加载、保存、...
- **缓存**:Hibernate支持第二级缓存和查询缓存,提高应用性能,减少对数据库的访问。 - **事务管理**:Hibernate支持JTA和JDBC两种事务管理方式,确保数据的一致性和完整性。 - **关联映射**:包括一对一、一对...
它支持JPA(Java Persistence API),并提供了自己的扩展功能,如第二级缓存、查询语言HQL以及 Criteria 查询等。 二、Hibernate配置 在使用Hibernate时,首先要进行配置。这包括定义数据源、实体类映射文件(.hbm....
二级缓存则可配置为应用程序范围,能跨Session共享,可以使用第三方缓存服务如EhCache。 5. **关联映射**:Hibernate支持多种对象之间的关联映射,包括一对一、一对多、多对一、多对多关系。这些关联可以在配置文件...
手册会讲解第一级缓存(Session级别的)和第二级缓存(SessionFactory级别的),以及第三方缓存集成,如 EhCache 和 Infinispan。 7. **集合映射(Collection Mapping)**:在Java对象中,集合如List、Set和Map经常...
8. **缓存机制**:Hibernate支持一级缓存和二级缓存,提高数据访问性能。手册会讲解缓存的配置和使用,包括 Ehcache 和 JBoss Cache 等。 9. **事务管理**:Hibernate提供了对事务的支持,包括编程式事务管理和声明...
6. **缓存**:解释了Hibernate的缓存策略,包括一级缓存和二级缓存,以及第三方缓存集成(如Ehcache)。 7. **事务和并发**:讨论了Hibernate如何处理事务,以及在并发环境下如何确保数据的一致性。 8. **高级特性...
5. **第一级缓存和第二级缓存**:第一级缓存是Session级别的,自动管理对象的状态;第二级缓存是SessionFactory级别的,可以跨Session共享数据,提高性能。 6. **集合映射**:Hibernate支持多种集合类型的映射,如...
- **缓存机制**:内置的一级和二级缓存,可以显著提高应用程序的性能。 - **支持多种数据库**:Hibernate支持广泛的数据库系统,如MySQL、Oracle、SQL Server等。 ### Hibernate的核心概念 - **Session**:是...
- 第二级缓存:可配置的独立缓存,跨Session共享数据,需第三方缓存实现(如EhCache)。 10. **事务管理** - Hibernate支持编程式和声明式事务管理,基于JTA或JDBC的Transaction API。 11. **Hibernate事件和...
9. **第二级缓存(Second-Level Cache)**:提高性能的一种机制,缓存对象在多个会话之间共享,可配置不同的缓存提供商如Ehcache。 10. **一对多(One-to-Many)、多对一(Many-to-One)关联**:在实体间建立关联,...
缓存是提高性能的关键,Hibernate支持一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存),并可以集成第三方缓存系统,如EhCache和Infinispan。 除此之外,手册还会涉及性能优化技巧,如延迟...