hibernate悲观乐观锁 缓存 二级缓存 抓取策略

hibernate

悲观锁   load 方法里 有对应的 LockMode 参数。实现悲观锁。( lazy 策略 失效。因为要锁定)

乐观锁   在配置文件 hbm 里面 class 标签中 增加 optimistic-lock=“version” 项,并且在想要做乐观锁的类里 增加 相应的 version 字段,然后在 id 标签下,增加 <version name = "version"> 标签,指明用做 version 的字段是 version 。并且在对应的类里增加 version 字段,如: private int version

               乐观锁的实现中,线程 A B 修改同样数据, B 先提交, version 增加。 A 再进行提交操作的话,会报出脏数据错误。

====================================================

HQL

createquery ()和 createSQLQuery ()

外置命名查询:在要查询的类的配置文件 hbm 中加入

< query name = "searchStudent" ><![CDATA[ select s from Student s where s.id < ? and s.classes.name like ]]></ query >

(其中用到了对象导航查询 s.classes.name

session.getNamedQuery("searchStudent") 来查询。

查询过滤器:在要查询的类的配置文件 hbm 中加入

< filter-def name = "stu_search_filter " >< filter-param name = "stu_name " type = "string" /></ filter-def >

class 标签中 加入:

<filter name="stu_search_filter " condition="name like :stu_name "></filter>

在程序中调用 session.enableFilter("stu_search_filter ").setParameter("stu_name ", "%0%"); 。对应着过滤器名称 和传入的参数。

 

二级缓存

一级缓存 的生命周期是 session

二级缓存 的生命周期是 sessionFactory

        所用 ehcache 来提供缓存

首先在 src 下加入 ehcache.xml 配置文件。 Ehcache 配置文件参数简介

MaxelementsInmemory=10000 缓存里最多存 10000 个对象

Eternal=false 不是永久有效

TimetoLiveseconds=”120” 对象在缓存中存活多长时间 s 为单位

Timetoidleseconds=”120” 空闲 多长时间不访问失效

OverflowTodisk=true  超出 10000 对象,是否保存到磁盘上。路径

<diskstore path=”java.io.tmpdir”>

然后在 hibernate.xml 中开启二级缓存(默认是开启的),声明缓存提供商,也就是处理缓存的类。启用二级缓存

< property name = "hibernate.cache.use_second_level_cache" > true </ property >

< property name = "hibernate.cache.provider_class" >

org.hibernate.cache.EhCacheProvider </ property >

<property name="hibernate.cache.use_query_cache">true</property>

并且在 mapping 标签下 加入所要实施缓存的类

<class-cache usage="read-only" class="com.john.hibernate.Student"/>

以上就可以完成缓存的设置。

通过设置缓存交互模式,可以设置管理缓存。

session.setCacheMode(CacheMode.GET/PUT/NOMAL);( 只读不写,只往缓存里放数据而不读数据。默认是可读可写 )

查询缓存

query.setCacheable(true);

Query query = session.createQuery( "fromStudent" );

query.setCacheable( true );

List stu = query.list();

 

关联对象的抓取策略 <many-to-one….fetch=”select”>

Select 另外发送一条 sql 抓取当前对象的关联对象或集合

Join  会用过 select 语句使用外连接 来加载其关联实体或集合 此时 lazy 失效。

Subselect 常用于集合 <set  fetch=”subselect”>

影响 HQL 查询。会通过一条子查询语句,把所有对象查出来。

 

Batch-size 属性 可以批量加载对象:

<class name="com.john.hibernate.Student" table="t_student" batch-size="5">

 

hibernate.xml 中加入

< property name = "hibernate.jdbc.batch_size" > 30 </ property > (批量更新缓存)

< property name = "hibernate.jdbc.fetch_size" > 50 </ property > (批量查询缓存)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值