(转)hibernate 二级缓存配置

news/2024/7/7 5:53:54

  在applicationContext.xml文件中添加以下代码:

<prop key= "hibernate.cache.use_second_level_cache" > true </prop>   <!--设置缓存机制为二级缓存 -->
<prop key= "hibernate.cache.use_query_cache" > true </prop>          <!--启动查询缓存 -->
<prop key= "hibernate.cache.provider_class" >org.hibernate.cache.EhCacheProvider</prop>  <!--设置二级缓存的Provider类 -->
<prop key= "hibernate.cache.provider_configuration_file_resource_path" >WEB-INF/classes/ehcache.xml</prop>   <!--设置缓存的配置文件路径 -->
                

 将ehcache.xml文件放到src下面,并配置ehcache.xml文件如下:

复制代码
<ehcache>
<diskStore path="D:\cache" />

<defaultCache maxElementsInMemory="10000" eternal="false"
timeToIdleSeconds="3600" timeToLiveSeconds="3600"
overflowToDisk="true" diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU" />
<cache name="net.nk.entity.DataAttr"
maxElementsInMemory="800" eternal="false" overflowToDisk="false"
timeToIdleSeconds="3600" timeToLiveSeconds="3600" />
<cache name="net.nk.entity.SmContentCategory"
maxElementsInMemory="800" eternal="false" overflowToDisk="false"
timeToIdleSeconds="3600" timeToLiveSeconds="3600" />
<cache name="net.nk.entity.SmProduct"
maxElementsInMemory="800" eternal="false" overflowToDisk="false"
timeToIdleSeconds="3600" timeToLiveSeconds="3600" />
<cache name="net.nk.entity.SmDepartment"
maxElementsInMemory="800" eternal="false" overflowToDisk="false"
timeToIdleSeconds="3600" timeToLiveSeconds="3600" />
<cache name="net.nk.entity.SmUser"
maxElementsInMemory="800" eternal="false" overflowToDisk="false"
timeToIdleSeconds="3600" timeToLiveSeconds="3600" />
<cache name="net.nk.entity.DataAttrValue"
maxElementsInMemory="3000" eternal="false" overflowToDisk="false"
timeToIdleSeconds="3600" timeToLiveSeconds="3600" />
<cache name="net.nk.entity.DataAm"
maxElementsInMemory="800" eternal="false" overflowToDisk="false"
timeToIdleSeconds="3600" timeToLiveSeconds="3600" />
<cache name="net.nk.entity.DataAttrGroup"
maxElementsInMemory="400" eternal="false" overflowToDisk="false"
timeToIdleSeconds="3600" timeToLiveSeconds="3600" />
</ehcache>
复制代码

在设置了缓存机制的类的xml文件中添加一段代码<cache usage="read-write" region="net.nk.entity.SmProduct"代码如下:

复制代码
<hibernate-mapping>
<!--SM_PRODUCT表的hibernate映射描述文件 -->
<class name="net.nk.entity.SmProduct" table="SM_PRODUCT" >
<cache usage="read-write" region="net.nk.entity.SmProduct"/>
<!-- ID -->
<id name="id" type="string">
<column name="ID" />
<generator class="assigned" />
</id>
复制代码

其中类的xml文件中的region设置要和ehcache.xml文件中的保持一致,此处是通过包名+类名的方式。

在调用数据库数据方法时,可采取以下设置:

复制代码
protected List<POJO> getAll(Class<T> entityClass,boolean iscache) throws SSHException {
HibernateTemplate ht = getHibernateTemplate();
if(iscache){
ht.setCacheQueries(true);
}
return ht.find("from "+entityClass.getName());//getHibernateTemplate().loadAll(entityClass);
}
复制代码


至此,可以通过放开hibernate的show_sql来查看是否缓存机制生效了

 

 

 

-------------------------------------

 

 

ibernate缓存的作用:

    Hibernate是一个持久层框架,经常访问物理数据库,为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据

Hibernate缓存分类:

  Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存

Hibernate一级缓存又称为“Session的缓存”,它是内置的,意思就是说,只要你使用hibernate就必须使用session缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。在第一级缓存中,持久化类的每个实例都具有唯一的OID。 

Hibernate二级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory不会启用这个插件。

 

什么样的数据适合存放到第二级缓存中?   

1 很少被修改的数据   

2 不是很重要的数据,允许出现偶尔并发的数据   

3 不会被并发访问的数据   

4 常量数据   

不适合存放到第二级缓存的数据?   

1经常被修改的数据   

2 .绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发   

3 与其他应用共享的数据。 

 

Hibernate查找对象如何应用缓存?

当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;如果都查不到,再查询数据库,把结果按照ID放入到缓存

删除、更新、增加数据的时候,同时更新缓存

 

Hibernate管理缓存实例

无论何时,我们在管理Hibernate缓存(Managing the caches)时,当你给save()、update()或saveOrUpdate()方法传递一个对象时,或使用load()、 get()、list()、iterate() 或scroll()方法获得一个对象时, 该对象都将被加入到Session的内部缓存中。 

当随后flush()方法被调用时,对象的状态会和数据库取得同步。 如果你不希望此同步操作发生,或者你正处理大量对象、需要对有效管理内存时,你可以调用evict() 方法,从一级缓存中去掉这些对象及其集合。

 

 Hibernate的查询方式

Sql、Criteria,object comptosition

Hql:

1、 属性查询

2、 参数查询、命名参数查询

3、 关联查询

4、 分页查询

5、 统计函数

 

 如何优化Hibernate?

1.使用双向一对多关联,不使用单向一对多

2.灵活使用单向一对多关联

3.不用一对一,用多对一取代

4.配置对象缓存,不使用集合缓存

5.一对多集合使用Bag,多对多集合使用Set

6. 继承类使用显式多态

7. 表字段要少,表关联不要怕多,有二级缓存撑腰

 

hibernate的开发步骤:

开发步骤

    1)搭建好环境

        引入hibernate最小的jar包

        准备Hibernate.cfg.xml启动配置文件

    2)写实体类(pojo)

    3)为实体类写映射文件"User.hbm.xml"

        在hibernate.cfg.xml添加映射的实体

    4)创建库表

    5)写测试类

        获得Configuration

        创建SessionFactory

        打开Session

        开启事务

        使用session操作数据

        提交事务

        关闭资源


http://www.niftyadmin.cn/n/4235428.html

相关文章

类似layui的前端框架_浅谈SSM+接口自动化框架结合搭建测试数据平台

一、搭建SSM框架网上有很多这方面的帖子供大家参考&#xff0c;我挑了几篇供大家参考&#xff0c;有兴趣的可以了解下&#xff1a;https://www.jianshu.com/p/fdf1c2ddf201http://www.uml.org.cn/j2ee/201904192.asp二、搭建接口自动化框架所用的框架是javatestngmaven&#xf…

(转)blob和text区别

&#xff08;mysql 是没有clob的&#xff09; &#xff08;大多数方面&#xff0c;可以将BLOB列视为能够足够大的VARBINARY列。同样&#xff0c;可以将TEXT列视为VARCHAR列。&#xff09; text分为4种类型&#xff1a;TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT&#xff0c;分别对应…

ubuntu 下mysql 命令操作

常见命令&#xff1a; show databases;显示所有库use pdns;选择pdns库show tables;查看库下所有表名select * from domains;查询domians表下的内容drop table domains;删除domains表drop database pdns;删除domain库create table pdns;建一个pdns库mysql -uroot -proot pdns &l…

mysql数据库垃圾分类_垃圾分类小程序的展示:(微信小程序+react后台管理+node后台写接口+mysql数据库)...

微信小程序&#xff1a;功能介绍&#xff1a;1.首页 2.查找 3.小知识知识 4.我的 5.登录 6.注册 7.浏览历史 8.问题反馈(需要登录后反馈)9.退出展示&#xff1a;1.首页2.查找3.小知识知识4.我的5.注册6.登录7.浏览历史8.清除缓存9.问题反馈(需要登录后反馈)10.退出Reac…

spring 不能生成抽象类

抽象类不能生成实例对象&#xff0c;spring无法注入 因为spring的原理是启动服务器时读取配置文件&#xff0c;取得类名后利用反射机制在spring上下文中生成一个单例的对象&#xff0c;由spring注入属性并维护此对象的状态&#xff0c;抽象类在反射生成对象时就已经失败了&…

oracle导入导出语句

ORACLE导入导出命令解析 本文对Oracle数据的导入导出 imp ,exp 两个命令进行了介绍, 并对其相应的参数进行了说明,然后通过一些示例进行 演练,加深理解. 文章最后对运用这两个命令可能出现的问题(如权限不够,不同oracle版本)进行了探讨,并提出了相应的解决方案; 本文部分内容摘…

(转) hibernate中使用数据库关键字(保留字)

在hibernate中&#xff0c;当一个实体对象使用了数据库保留字作为字段名称&#xff08;虽说不推荐&#xff0c;但少数情况下必须使用&#xff09;&#xff0c;执行保存操作时&#xff0c;你可能会遇到如下错误。 ERROR JDBCExceptionReporter:78 - You have an error in your S…

mysql类似plsql提交更改_MySql比较好用的管理工具,有没有类似PLSQL的?

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"云数据库SQL Server&#xff0c;具有企业许可…