在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操作数据
提交事务
关闭资源