spring整合hibernate 关于大数据缓存处理
来源:互联网 发布:法丽达只有淘宝店吗 编辑:程序博客网 时间:2024/06/04 18:15
EhCache是Hibernate的二级缓存技术之一,可以把查询出来的数据存储在内存或者磁盘,节省下次同样查询语句再次查询数据库,大幅减轻数据库压力;
EhCache的使用注意点
当用Hibernate的方式修改表数据(save,update,delete等等),这时EhCache会自动把缓存中关于此表的所有缓存全部删除掉(这样能达到同步)。但对于数据经常修改的表来说,可能就失去缓存的意义了(不能减轻数据库压力);
在hibernate中我们最常用的有三类缓存,分别为一级缓存、二级缓存和查询缓存,下面我们对这三个缓存在项目中的使用以及优缺点分析一下。
缓存它的作用在于提高性能系统性能,介于应用系统与数据库之间而存在于内存或磁盘上的数据。
我们编程的模式一般是这样的page-->filter-->action-->server-->dao-->db,可以在这一个请求过程中的任何一点加入缓存.
在比较少更新表数据的情况下,EhCache一般要使用在比较少执行write操作的表(包括update,insert,delete等)[Hibernate的二级缓存也都是这样];对并发要求不是很严格的情况下,两台机子中的缓存是不能实时同步的;
1、spring文件配置
a)hibernate第三方缓冲jar配置
<property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider</property>
<!-- Enable Second-Level Cache and Query Cache Settings -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_query_cache">true</property>
b)hibernate第三方缓冲jar配置(没有亲自做过实验)
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
2、在查询的实体配置文件中加上一个配置
<!--配置的与数据库映射的实体-->
<class name="com.hoo.hibernate.entity.User" table="USER" lazy="false">
<!--配置的缓存策略-->
<cache usage="transactional|read-write|nonstrict-read-write|read-only" />
关于选择缓存策略依据:
ehcache不支持transactional,其他三种可以支持。
1:read- only:无需修改, 可以对其进行只读缓存,注意:在此策略下,如果直接修改数据库,即使能够看到前台显示效果,但是将对象修改至cache中会报error,cache不会发生作用。另:删除记录会报错,因为不能在read-only模式的对象从cache中删除。
2:read-write:需要更新数据,那么使用读/写缓存比较合适,前提:数据库不可以为serializable transaction isolation level(序列化事务隔离级别)
3:nonstrict-read-write:只偶尔需要更新数据(也就是说,两个事务同时更新同一记录的情况很不常见),也不需要十分严格的事务隔离,那么比较适合使用非严格读/写缓存策略。
3、如果使用的是注解
如果你使用的注解方式,没有User.hbm.xml,那么你也可以用注解方式配置缓存
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User implements Serializable {
}
4、配置打开缓存(一劳永逸的做法)
当你整合Spring时,如果你的HibernateTemplate模板配置在Spring的Ioc容器中,那么你可以这样启用query cache
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
<property name="cacheQueries">
<value>true</value>
</property>
</bean>
此后,你在dao模块中注入sessionFactory的地方都注入hibernateTemplate即可。(这里可能会影响不需要查询缓存的地方也缓存了)
5、在需要打开缓存的地方开缓存
spring框架中提供的hibernate方法,虽然有getHibernateTemplate().setCacheQueries(),但该方法影响的是全局的配置,一旦启用,将会对不需要缓存的查询造成不良影响。
hibernateService()中添加了一个方法:
public ListfindByCachedQuery(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。
6、配置ehcache文件
<ehcache>
<!--diskStore:代表当二级缓存对象数据在内存中溢出,如果需要写入文件系统时的文件目录-->
<diskStorepath="java.io.tmpdir"/>
<!--efaultCache:默认的calss缓存配置,如果某个对象没有其专有的配置时,ehcache一律启用默认配置。-->
<defaultCache
<!--maxElementInMemory:对象在内存中可存放的最大数量。-->
maxElementsInMemory="10000"
<!--eternal:表示对象永不过期,如果选true则timeToIdleSeconds,timeToLiveSeconds两项无效。-->
eternal="false"
<!--timeToIdleSeconds:对象的空闲状态过期时间,单位为秒,0为可以无限制空闲。-->
timeToIdleSeconds="1800"
<!-- timeToLiveSeconds:对象存在的最长时间,单位为秒(注意,如果该项比5项要小,则第5项无意义),0为永不过期。-->
timeToLiveSeconds="1800"
<!--overflowToDisk:当对象在内存中的数量超过maxElementInMemory值时,如果该项为true,则ehcahe会把对象数据写入diskStore项指定的目录。-->
overflowToDisk="true"
/>
</ehcache>
如果需要对某个具体对象进行单独配置时,可以加上一组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将为查询缓存启用默认配置。
7、关联缓存
目前我们仅仅实现了对一个对象的缓存,那如何对该对象的关联对象集合进行缓存呢?
实例:对某个对象的关联对象集合的二级缓存,需要在该对象的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()。
查询缓存,目的是为了将通过list()方法的查询结果存入缓存中,并实现对语句的缓存,如果下次用户在使用这条语句进行查询时,将直接从缓存中获取对象数据。
这里要注意的是,查询缓存必须配合class缓存使用,如果只启用查询缓存,不对查询对象启用二级缓存,则会大大降低查询效率。
因为,当第一次通过启用查询缓存的session进行语句查询时,系统只执行一次数据库查询将所有的记录取出,并将对象存入class缓存,语句及id集合存入查询缓存;而当用户第二次查询该语句时,系统将先执行去查询缓存中查找,取出所有符合条件的id集合,如果这时候该对象的class缓存没启用或在class缓存中已过期,系统将根据id,一个个去数据库load,实际上是进行了1+N次查询。
总结:
缓存在一个项目中对于提高系统性能很重要,除了ehcache之外还有memcache、redis等缓存产品目前都很常用,redis具有丰富的数据类型以及单线程高效能访问效率,memcache虽然是多线程但效率还是没有redis高。
这些缓存产品都可以实现分布式缓存,ehcache+rmi可以分布式缓存同步;memcache+redis都支持分布式,redis还提供了高可用性的解决方案:主从复制几个服务器直接受你可以切换
- spring整合hibernate 关于大数据缓存处理
- hibernate整合spring异常处理
- 关于hibernate与spring整合
- Hibernate spring 整合数据只存在缓存而没有提交给数据库的解决办法
- spring、struct、hibernate三大框架整合
- struts2,spring,hibernate三大框架整合
- 三大框架整合(Struts2 Spring Hibernate)
- spring、struct、hibernate三大框架整合
- Struts Spring Hibernate三大框架整合
- spring+springMVC+hibernate 三大框架整合
- spring+springMVC+hibernate 三大框架整合
- Spring+SpringMVC+Hibernate三大框架整合
- 三大框架整合struts+spring+hibernate
- Spring整合Redis实现数据缓存
- spring-boot | 整合Redis缓存数据
- Hibernate大数据性能处理
- hibernate批量处理大数据
- Spring+Hibernate大批量处理数据
- 23种设计模式之形象比喻
- jquery ajax
- Oracle 数据库 11g新特性:自适应游标与 SQL 计划管理
- 在fairland的生活
- Yahoo Hadoop Module 7: Managing a Hadoop Cluster
- spring整合hibernate 关于大数据缓存处理
- unity3D学习笔记
- 如何使用Tomcat配置本地服务器
- 第三周实践项目二————本月有几天
- Material Design (三),Snackbar的使用
- Dispatcher
- 【Hadoop学习】之Map-Reduce(一)
- 番外篇:flask.sqlite3之灵异bug
- Activity的启动模式