




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1. Hibernate 检索1.1. hibernate 检索方式说明Hibernate 提供了以下几种检索对象的方式导航对象图检索方式:根据已经加载的对象导航到其他对象OID 检索方式: HQL 检索方式:QBC 检索方式:按照对象的 OID 来检索对象使用面象的 HQL 查询语言使用 QBC(Query By Criteria) API 来检索对象.这种 API 封装了基于字符串形式的查询语句, 提供了更加面象的查询接口.本地 SQL 检索方式: 使用本地数据库的 SQL 查询语句1.2. HQL 检索方式HQL(Hibernate Query Language) 是面象的查询语言, 它
2、和SQL 查询语言有些相似. 在 Hibernate 提供的各种检索方式中, HQL 是使用最广的一种检索方式. 它有如下功能:在查询语句中设定各种查询条件支持投影查询, 即仅检索出对象的部分属性支持分页查询支持连接查询支持分组查询, 允许使用 HAVING 和 GROUP BY 关键字提供内置函数, 如 sum(), min() 和 max()能够调用 用户定义的 SQL 函数或标准的 SQL 函数支持子查询支持动态绑定参数HQL 检索方式包括以下步骤:通过 Ses的 createQuery() 方法创建一个 Query 对象, 它包括一个 HQL 查询语句. HQL 查询语句中可以包含命名
3、参数动态绑定参数调用 Query 的 list() 方法执行查询语句. 该方法返回 java.util.List 类型的查询结果,在 List 集合中存放了符合查询条件的持久化对象.Qurey 接口支持方法链编程风格, 它的 set() 方法返回自身实例, 而不是 void 类型HQL vs SQL:HQL 查询语句是面象的, Hibernate 负责HQL 查询语句, 然后根据对象-关系文件中的信息, 把 HQL 查询语句翻译成相应的 SQL 语句. HQL 查询语句中的主体是域模型中的类及类的属性SQL 查询语句是与关系数据库绑定在一起的. SQL 查询语句中的主体是数据库表及表的字段.H
4、QL 的语法类似 SQL 语法。1.2.1. 绑定参数Hibernate 的参数绑定机制依赖于 JDBC API 中的 PreparedSement 的预定义 SQL语句功能.HQL 的参数绑定由两种形式:按参数名字绑定: 在 HQL 查询语句中定义命名参数, 命名参数以 “:” 开头.按参数位置绑定: 在 HQL 查询语句中用 “?” 来定义参数位置相关方法:setEntity(): 把参数与一个持久化类绑定setParameter(): 绑定任意类型的参数. 该方法的第三个参数显式指定射类型Hibernate映绑定参数的形式,按参数名称绑定绑定参数的形式,按参数位置绑定Query quer
5、y = ses.createQuery(from Customer =? and c.age=?); query.setString(0,Tom);query.seteger(1, 21); Query.list();hql 查询:Query query = ses.createQuery(from Customer c where +=:custnameandc.age=:custage);/第一个参数代表名二个参数代表值 query.setString(custname, Tom); query.seteger(custage, 21);List lis
6、t = query.list();1.2.2. 使用别名通过 HQL 检索一个类的实例时,如果查询语句的其他地方需要指定一个别名它,应该为这个类from Customer ascwhereas 可省略=:custname1.2.3. 排序HQL 采用 ORDER BY 关键字对查询结果排序hql 查询:Query query = ses.createQuery(from Customer c order by c.id);QBC 查询:Criteria criteria = ses criteria.addOrder(.createCriteria(Customer.class);
7、.hibernate.criterion.Order.asc(“id);1.2.4. 分页查询:setResult(Result): 设定从哪一个对象开始检索, 参数Result 表示这个对象在查询结果中的索引位置, 索引位置的起始值为 0. 默认情况下, Query 从查询结果中的第一个对象开始检索setMaxResult(maxResults): 设定一次最多检索出的对象的数目. 在默认情况下, Query和 Criteria 接口检索出查询结果中所有的对象1.2.5. 投影查询投影查询: 查询结果仅包含实体的部分属性. 通过 SELECT 关键字实现.Query 的 list() 方法返
8、回的集合中包含的是数组类型的元素, 每个对象数组代表查询结果的一条可以在持久化类中定义一个对象的构造器来包装投影查询返回的全运用面象的语义来查询结果集.可以通过 DISTINCT 关键字来保证查询结果不会返回重复元素, 使程序代码能完使用构造函数/list集合中存放的对象数组,数组中存放的查询的部分属性Query query = ses.createQuery(select c.id,,o.orderNumber + from Customer cjoin c.orders owhere o.orderNumber like%NO1%);List list = query.list
9、(); Iterator it = list.iterator(); while (isNext() Object pair=(Object)it.next(); eger id=(egair0;String name=(String)pair1;String orderNumber=(String)pair2;System.out.pr(id + +name+orderNumber); System.out.prln();from Customer c join c.orders o where o.orderNumber like T%如果希望查询结果中只包含Customer对象,可使用以
10、下形式:select c from Customer c join c.orders o where o.orderNumber like T%Select关键字还能用于选择对象的部分属性ses.createQuery(“select c.id,,o.orderNumber from Customer c join c.orders o where o.orderNumber like T%”)对应的sql语句为:select c.ID,c.NAME,o.ORDER_NUMBER from CUSTOMERS c inner join ORDERS o on c.ID-=o.CUS
11、TOMER_ID where o.ORDER_NUMBER likeT%过滤重复元素createQuery(“select distinct from customer c”);1.2.6. 分组与函数报表查询用于对数据分组和统计, 与 SQL 一样, HQL 利用 GROUP BY据分组, 用 HAVING 关键字对分组数据设定约束条件.关键字对数HQL 查询语句中可以调用以下count() min()max()sum()avg()在函数List list=ses.createQuery(select ,count(c)from Customer c group b
12、y ).list(); System.out.prln(list.size();Query query = ses.createQuery(select new cn.CustomerRow(c.id,,o.orderNumber) + from Customer cjoin c.orders owhere o.orderNumber like%NO1%); List list = query.list();Iterator it = list.iterator();while (isNext() CustomerRow cr=(CustomerRow)it.next(
13、);System.out.pr(cr.getId() + +cr.getName()+ +cr.getOrderNumber(); System.out.prln();1.2.7. 在文件中定义命名查询语句1.2.8. 其他的查询动态查询:ses.createCriteria(Customer.class).add(Expres.like(“name”,name.toLowerCase(),Matode.ANYWHERE).query = ses.getNamedQuery(“findCustomersByName”); query.setString(“name”,”Tom”);query.
14、list();使用函数Query query = ses.createQuery(select count(*) from Customer c);/eger count=(eger)query.uniqueResult();/System.out.prln(count +count);/*/Query query = ses.createQuery(select avg(c.age) from Customer c);/Float avg=(Float)query.uniqueResult();/System.out.prln(avg +avg);/*/Queryquery=ses.crea
15、teQuery(selectmax(c.age),min(c.age)from Customer c);/Object maxmin=(Object)query.uniqueResult();/System.out.prln(max +(Long)maxmin0);/System.out.prln(min +(Long)maxmin1);/*/Query query = ses.createQuery(select sum(c.age) from Customer c);/Long sum=(Long)query.uniqueResult();/System.out.prln(sum +sum
16、);.add(Expres.eq(“age”,neweger(11);集合过滤:hql:createQuery(“from Order o where o.customer=:customer and o.price100 order by o.price”).setEntity(“customer”,customer).list();使用集合过滤:ses.createFilter(customer.getOrders(),”where this.price 100order by this.price”).list();子查询:from Customer c where 1 Restrict
17、ions.ge大于等于=Restrictions.lt小于Restrictions.le小于等于=Restrictions.betn对应 sql 的 betn 子句Restrictions.like对应 sql 的 like 子句Restrictions.in对应 sql 的 in 子句Restrictions.andand 关系Restrictions.oror 关系Restrictions.sqlRestrictionSql 限定查询1.5. 简单的查询/使用 hql 查询Query query=ses List list=query.list();.createQuery(from Cu
18、stomer c where = tom1 );/使用 qbc 查询主要由 Criteria、Criterion 接口和 Restrictions 类组成,他支持在运行时动态生成查询语句。Criteria criteria=ses.createCriteria(Customer.class);/设定查询条件,每个 Criterion 实例代表一个查询条件Criterion cn1=Restrictions.eq(name, tom1); criteria.add(cn1);list=criteria.list();/方法链编程:ses.createCriteria(Custome
19、r.class).add(Restrictions.eq(name, tom1).list();1.6. HQL 和 QBC 支持的各种运算运算类型HQL 运算符QBC 运算方法比较运算=Restrictions.eq()Restrictions.not(Restrictions.eq()=Restrictions.ge()Restrictions.lt()=Restrictions.le()is nullRestrictions.isNull()is not nullRestrictions.isNotNull()范围运算符inRestrictions.in()not inRestricti
20、ons.not(Restrictions.in()betnRestrictions.betn()not betnRestrictions.not(Restrictions.betn()字符串模式匹配likeRestriction.like()1.6.1. 小结2.事务和并发2.1. 数据库的级别对于同时运行的多个事务, 当这些事务数据库中相同的数据时, 如果没有采取必要的机制, 就会导致各种并发问题: 脏读: 对于两个事物 T1, T2, T1了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1的内容就是临时且无效的.不可重复读: 对于两个事物 T1, T2, T1了一个
21、字段, 然后 T2 更新了该字段.幻读:表中之后, T1 再次同一个字段, 值就不同了.对于两个事物 T1, T2, T1 从一个表中了一些新的行. 之后, 如果 T1 再次了一个字段, 然后 T2 在该同一个表, 就会多出几行.数据库事务的性: 数据库系统必须具有并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.一个事务与其他事务的程度称为级别. 数据库规定了多种事务级别, 不同级别对应不同的干扰程度,级别越高, 数据一致性就越好, 但并发性越弱比较方面HQL 检索QBC 检索可读性优点:和 sql 相近,易读将语句成一组 criteria,较差功能支持各种查询不支持报表查询
22、查询。有限的连接查询查询语句形式基于字符串形式的 sql更加面象何时被运行时被编译时被,更易排错可扩展性不具扩展性用户可扩展 criteria 接口对动态查询语句的支持支持动态查询,编程麻烦适合动态生成查询语句逻辑andRestriction.and()|Restriction.conjunction()orRestriction.or()|Restriction.disjunction()notRestriction.not()SQL ANSI SQL 标准定义了 4种事务级别,级别越高,成本越高:注:Oracle 只支持 2 种事务级别:READ COMMITED, SERIALIZABL
23、E. Oracle 默认的事务级别为: READ COMMITED支持 4 中事务级别。默认的事务级别为: REPEATABLE READ2.2. 在中设置级别每启动一个程序, 就会获得一个单独的数据库连接.每个数据库连接都有一个全局变量 tx_isolation, 表示当前的事务级别.为 Repeatable Read默认的级别查看当前的级别:当前连接:SELECT tx_isolation;全局:SELECT global.tx_isolation;设置当前连接的级别:set tran或 set sesion isolation level read committed;tranion i
24、solation level readmitted;设置数据库系统的全局的级别:set global tranion isolation level read committed;2.3. 在 Hibernate 中设置级别JDBC 数据库连接使用数据库系统默认的级别. 在 Hibernate 的配置文件中可以显式的设置级别. 每一个级别都对应一个整数:级别对应的整数表示READMITED1READ COMMITED2REPEATABLE READ4SERIALIZEABLE8Hibernate 通过为 Hibernate级别。例:hibernate.connection.isolation
25、= 4文件指定 hibernate.connection.isolation 属性来设置事务的注意Hibernate 不可能改变在受管环境下由应用服务器提供的数据库连接的过改变应用服务器配置的方式来改变.级别,只能通设置级别是全局选项,会影响所有的连接和事务2.4. 管理 ses(CurrentSesContext)2.4.1. 关于管理 Ses管理 Ses对象的生命周期也是可行的, 但是在实际 Java 应用中,尽管让程序把管理 Ses架构Hibernate 3对象的生命周期交给 Hibernate 管理, 可以简化 Java 应用程序代码和自身提供了三种管理 Ses对象的方法 在 SesS
26、esSes对象的生命周期与本地线程绑定对象的生命周期与 JTA 事务绑定Hibernate 委托程序管理 Ses对象的生命周期Hibernate 的配置文件中, hibernate.current_ses_context_class 属性用于指定管理方式,thread: Ses可选值包括对象的生命周期与本地线程绑定jta*: Ses对象的生命周期与 JTA 事务绑定managed: Hibernate 委托程序来管理 Ses对象的生命周期2.4.2. Ses对象的生命周期与本地线程绑定(通过Thread-localSes,线程本地化)如果把 Hibernate 配置文件的hibernate.c
27、urrent_ses_context_class 属性值设为thread, Hibernate 就会按照与本地线程绑定的方式来管理 SesHibernate 按以下规则把 Ses与本地线程绑定当一个线程(threadA)第一次调用 SesFactory 对象的 getCurrentSes() 方法时,A) 对象, 把该对象与 threadA 绑定, 并将该方创建一个新的 Ses(sessesA 返回当 threadA 再次调用 SesFactory返回 sesA 对象对象的 getCurrentSes() 方法时, 该方法将当 threadA 提交 sesA 对象关联的事务时, Hiberna
28、te 会自动sesA 对象的缓存, 然后提交事务, 关闭 sesA 对象. 当 threadA撤销 sesA 对象关联的事务时, 也会自动关闭 sesA 对象若 threadA 再次调用 SesFactory 对象的 getCurrentSes() 方法时, 该方又创建一个新的 Ses返回(sesB) 对象, 把该对象与 threadA 绑定, 并将 sesB配置:在 hibernate.cfg.xml 文件中增加thread不是调用 sesFactory.openSes().而是调用 sesFactory. getCurrentSes().获取ses对象.从当前的线程提取 ses:当前线程如
29、果存在 ses当前线程如果不存在 ses对象,取出直接使用对象,获取一个新的 ses对象和当前的线程绑定测试代码:性能3.3.1. 使用连接池配置 c3p0 连接池* 引入 c3p0-0.9.1.jar3.2. Hibernate 的检索策略3.2.1. hibernate 的检索策略简介类级别和关联级别可选的检索策略及默认的检索策略3.2.2. 区分立即检索和延迟检索检索策略的作用域可选的检索策略默认的检索策略运行时行为受影响的 ses的检索方法类级别立即延迟延迟load关联级别立即延迟迫切左外连接检索延迟load get* 在 hibernate.cfg.xml 文件中增加如下配置.hib
30、ernate.connection.C3P0ConnectionProvid5201203000class中lazy=true 延迟检索public void loadCustomerTrue()Sesses=sesFacoty.openSes(); Tran ion tx=ses.begranion();Customer c=(Customer)ses.load(Customer.class, 1);/该行代码让hibernate执行select语句,/查询数据库(需要用的时候查数据库) c.getAge();mit();ses.close();Class中lazy=false 立即检索pu
31、blic void loadCustomerFalse()Sesses=sesFacoty.openSes(); Tranion tx=ses.begranion();/该行代码让hibernate执行select语句,查询数据库Customer c=(Customer)ses.load(Customer.class, 1); c.getAge();mit();ses.close();3.2.3.理解延迟检索中的对象的类名如下所示:Hibernate 使用 javassist-3.9.0.GA.jar 包创建值,其他的值不初始化)。Customer 对象对象(初始化 oid 的public v
32、oid loadCustomertrueProxy()Sesses=sesFacoty.openSes(); Tranion tx=ses.begranion();/此时查询到的c对象是一个对象Customer c=(Customer)ses.load(Customer.class, 1); System.out.prln(c.getClass().getName();/对象 c.getClass();/hibernate不会执行select语句c.getId();/hibernate不会执行select语句 c.getAge();/该行hibernate会执行select语句mit();se
33、s.close();只有延迟检索会产生对象,立即检索不会产生对象3.2.4.初始化延迟检索中的3.2.5.区分类级别和关联级别的检索关联级别的检索:Customer c=(Customer)ses.load(Customer.class, 1);Set set=c.getOrders()/检索Order对象的set集合在这个例子中ses.load(Customer.class, 1):查询的主体表 c.getOrders():查询客体表查询客体表是否发生,以何种方式发生(立即检索、延迟检索和迫切左外连接检索),就是关联级别检索通过set元素lazy属性设定类级别的检索:Customer c=(
34、Customer)ses.load(Customer.class, 1);ses的方法直接检索Customer 对象, 对Customer 对象到底采用立即检索还是延迟检索方式,是通过class元素的lazy属性设定的/初始化对象public void loadCustomertrueProxyInit()Sesses=sesFacoty.openSes(); Tranion tx=ses.begranion();/此时查询到的c对象是一个对象Customer c=(Customer)ses.load(Customer.class, 1); System.out.prln(c.getClass
35、();/对象/判理对象是否被初始化 对集合对象也适用if(!Hibernate.isInitialized(c)System.out.prln(c.getClass();/对象System.out.prln(没有被初始化);/初始化对象 hibernate执行select查询 Hibernate.initialize(c);mit();ses.close();.类级别检索策略类级别可选的检索策略包括立即检索和延迟检索, 默认为延迟检索类级别的检索策略可以通过 元素的 lazy 属性进行设置如果程序加载一个对象的目的是为了它的属性, 可以采取立即检索. 如果程序加载一个持久化对象的
36、目的是仅仅为了获得它的, 可以采用延迟检索无论 元素的 lazy 属性是 true 还是 false, Ses list() 方法在类级别总是使用立即检索策略若 元素的 lazy 属性为 true 或取默认值, Ses的 get() 方法及 Query 的的 load() 方法不会执行查询类实例有如下特征:数据表的 SELECT 语句, 仅返回类对象的实例, 该由 Hibernate 在运行时采用 javassist 工具动态生成Hibernate 创建在应用程序第一次类实例时, 仅初始化其 OID 属性类实例的非OID 属性时, Hibernate 会初始化类实例.关联级别的检
37、索策略在文件中, 用 元素来配置一对多关联及多对多关联关系. 元素有 lazyfetch 属性。和lazy: 主要决定 orders 集合被初始化的时机. 即到底是在加载 Customer 对象时就被初始化, 还是在程序orders 集合时被初始化fetch: 取值为 “select” 或 “subselect” 时, 决定初始化 orders 的查询语句的形式;若取值为”join”, 则决定 orders 集合被初始化的时机若把 fetch 设置为 “join”, lazy 属性将被忽略.1.一对多和多对多关联的检索策略(set) 元素的 lazy 和 fetch 属性fetc
38、h(默认值 select)Lazy(默认值是 true)策略Joinfalse采用迫切左外联接检索。Jorue采用迫切左外联接检索。joinextra采用迫切左外联接检索。selectfalse采用立即检索selectTrue采用延迟检索selectextra采用延迟检索c.getOrders().size()执行 select count(id) from orderswhere customer_id =?for(Order o:set) o.getOrderNumber(); 将执行:select customer_id , id,order_number ,price from ord
39、ers where customer_id=?subselectfalse/true/extra也分为 3 中情况嵌套子查询(检索多个 customer 对象时) Lazy 属性决定检索策略)select customer_id,order_numbrice from orders where customer_idin (select id from customers).2.延迟检索和增强延迟检索在延迟检索(lazy 属性值为 true) 集合属性时, Hibernate 在以下情况下初始化集合类实例应用程序第一次contains() 等方法集合属性 : iterator()
40、, size(), isEmpty(),通过 Hibernate.initialize() 静态方法显式初始化增强延迟检索(lazy 属性为 extra): 与 lazy=“true”能进一步延迟 Customer 对象的 orders 集合类似. 主要区别是增强延迟检索策略实例的初始化时机:当程序第一次orders 属性的 iterator() 方法时, 会导致 orders 集合类实例的初始化order 属性的 size(), contains()和 isEmpty() 方法时, Hibernateselect 语句查询必要的信息, 不当程序第一次不会初始化 orders 集合类的实例,
41、仅通过特定的会检索所有的 Order 对象.3.用带子查询的 select 语句整批量初始化 orders 集合(fetch 属性为“subselect”) 元素的 fetch 属性: 取值为 “select” 或 “subselect” 时, 决定初始化 orders 的查询语句的形式;若取值为”join”, 则决定 orders 集合被初始化的时机.默认值为 select当 fetch 属性为 “subselect” 时假定 Ses缓存中有 n 个 orders 集合类实例没有被初始化, Hibernate 能够通过带子查询的 select 语句, 来批量初始化 n 个 or
42、ders 集合类实例.4.迫切左外连接检索(fetch 属性值设为 “join”)fetch 属性为 “join” 时:检索 Customer 对象时, 会采用迫切左外连接(通过左外连接加载与检索指定的对象关联的对象)策略来检索所有关联的 Order 对象lazy 属性将被忽略当Query 的 list() 方或立即加载策略忽略文件中配置的迫切左外连接检索策略, 而依旧采用延迟.多对一和一对一关联的检索策略元素也有一个lazy属性和fetch属性和 一样, 元素也有一个lazy 属性和fetch 属性.若 fetch 属性设为 join, 那么 lazy 属性被忽略
43、迫切左外连接检索策略的优点在于比立即检索策略使用的 SELECT 语句更少.无延迟检索需要增强持久化类的字节码才能实现Query 的 list 方略忽略文件配置的迫切左外连接检索策略, 而采用延迟检索策如果在关联级别使用了延迟加载或立即加载检索策略, 可以设定批量检索的大小, 以帮助提高延迟检索或立即检索的运行性能.Hibernate 允许在应用程序中覆盖文件中设定的检索策略.fetch(默认值 select)Lazy(默认值是 proxy)策略Joinfalse采用迫切左外联接检索。Joinproxy采用迫切左外联接检索。joinno-proxy采用迫切左外联接检索。selectfalse采
44、用立即检索selectproxy如果对端 Customer.hbm.xml 中类级别的检索是立即检索则为立即检索如果对端 Customer.hbm.xml 中类级别的检索是延迟检索则为延迟检索selectno-proxy-(不研究)3.2.6.比较三种检索策略3.3. 二级缓存3.3.1. Hibernate 的缓存缓存(Cache): 计算机领域非常通用的概念。它介于应用程序和盘上的文件或者数据库)之间,其作用是降低应用程序直接读写性数据性数据源(如硬源的频率,从而提高应用的运行性能。缓存中的数据是数据是内存源中数据的拷贝。缓存的物理介质通常Hibernate 中提供了两个级别的缓存第一级别
45、的缓存是 Ses级别的缓存,它是属于事务范围的缓存。这一级别的缓存由 hibernate 管理的,一般情况下无需进行干预Ses第二级别的缓存是 SesFactory 级别的缓存,它是属于进程范围的缓存Factory 的缓存可以分为两类:内置缓存: Hibernate 自带的, 不可卸载. 通常在 Hibernate 的初始化阶段, Hibernate会把元数据和预定义的 SQL 语句放到 SesFactory 的缓存中,元数据元数据推到是文件中数据的, 而预定义 SQL 语句时 Hibernate 根据出来的. 该内置缓存是只读的.外置缓存(二级缓存): 一个可配置的缓存插件. 在默认情况下,
46、 SesFactory 不会启用这个缓存插件. 外置缓存中的数据是数据库数据的, 外置缓存的物理介质检索策略优点缺点优先考虑使用的场合立即检索对应用程序完全透明,不管对象处于持久化状态还是游离状态,应用程序都可以从一个对象导航到关联的对象select 语句多可能会加载应用程序不需要 的对象,浪费许多内存空间。类级别应用程序需要立即的对象使用了二级缓存延迟检索由应用程序决定需要加载哪些对象,可以避免执行多余的 select 语句,以及避免加载应用程序不需要 的对象。因此能提高检索性能,并节省内存空间。应用程序如果希望游离状态的 类实例,必须保证她在持久化状态时已经被初始化。一对多或者多对多关联应
47、用程序不需要立即 或者根本不会访问的对象迫切左外 连接检索对应用程序完全透明,不管对象处于持久化状态还是游离状态,都可从一个对象导航到另一个对象。使用了外连接,select 语句少可能会加载应用程序不需要 的对象,浪费内存。复杂的数据库表连接也会影响检索性能。多对一或一对一关联需要立即的对象数据库有良好的表连接性能。可以是内存或硬盘3.3.2. hibernate 二级缓存的结构3.3.3. 理解二级缓存的并发策略两个并发的事务同时持久层的缓存的相同数据时, 也有可能出现各类并发问题.二级缓存可以设定以下 4 种类型的并发级别策略, 每一种策略对应一种事务只读型(Read-Only):提供 S
48、erializable 数据级别, 对于从来不会被修改的数据,可以采用这种策略读写型(Read-write): 提供 Read Commited 数据级别.对于经常读但是很少被修改的数据, 可以采用这种类型, 因为它可以防止脏读非严格读写(Nonstrict-read-write): 不保证缓存与数据库中数据的一致性. 提供 Readmited 事务级别, 对于极少被修改, 而且允许脏读的数据, 可以采用这种策略事务型(Tranional): 仅在受管理环境下适用. 它提供了 Repeatable Read 事务隔离级别. 对于经常读但是很少被修改的数据, 可以采用这种防止脏读和不可重复读类型
49、, 因为它可以适合放入二级缓存中的数据:很少被修改不是很重要的数据, 允许出现偶尔的并发问题不适合放入二级缓存中的数据:经常被修改财务数据, 绝对不允许出现并发问题与其他应用数据共享的数据3.3.4. 缓存提供的供应商Hibernate 的二级缓存是进程或集群范围内的缓存, 缓存中存放的是对象的散装数据二级缓存是可配置的的插件, Hibernate 允许选用以下类型的缓存插件:EHCache: 可作为进程范围内的缓存, 存放数据的物理介质可以使内存或硬盘, 对Hibernate 的查询缓存提供了支持OpenSymphony OSCache:可作为进程范围内的缓存, 存放数据的物理介质可以使内存
50、或硬盘, 提供了丰富的缓存数据过期策略, 对 Hibernate 的查询缓存提供了支持 SwarmCache: 可作为集群范围内的缓存, 但不支持 Hibernate 的查询缓存4JsCache:可作为集群范围内的缓存, 支持Hibernate 的查询缓存空白代表不支持)种缓存插件支持的并发策略(x 代表支持,3.3.5. 配置 ehcache 缓存.配置步骤1, 拷贝 ehcache-1.5.0.jar 到当前工程的 lib 目录下2, 开启二级缓存true 3, 指定缓存的供应商.hibernate.cache.EhCacheProvider指定使用二级缓存的类方法一 在使用
51、类的*.hbm.xml 配置选择需要使用二级缓存的持久化类, 设置它的二级缓存的并发4,策略, 元素的 cache 子元素表明 Hibernate 会缓存对象的简单属性, 但不会缓存集合属性,若希望缓存集合属性中的元素, 必须在 元素中加入 子元素方法二 在 hibernate.cfg.xml 文件中配置(建议)!-下面 -class-cache class=cn.c3p0.Order usage=read-write/配置 ehcache 默认的配置文件 ehcache.xml(名字固定)(放在类路径下)5,ehcache.xml 文件.ehcache.xml 文件配置说明:指
52、定一个目录, 当 EHCache 把数据写到硬盘上时, 将把数据写到这个文件目录下.默认是 C:WINDOWSTemp: 设置缓存的默认数据过期策略 设定具体名缓存的数据过期策略每个命名缓存代表一个缓存区域,每个缓存区域有各自的数据过期策略。命名缓存机制使得用户能够在每个类以及类的每个集合的粒度上设置数据过期策略。cache 元素的属性name:设置缓存的名字,它的取值为类的全限定名或类的集合的名字maxElementsemory :设置基于内存的缓存中可存放的对象最大数目eternal:设置对象是否为的,true 表示永不过期,此时将忽略 timeToIdleSeconds 和timeToL
53、iveSeconds 属性; 默认值是falsetimeToIdleSeconds:设置对象空闲最长时间,以秒为, 超过这个时间,对象过期。当对象过期时,EHCache 会把它从缓存中清除。如果此值为 0,表示对象可以无限期地处于空闲状态。timeToLiveSeconds:设置对象生存最长时间,超过这个时间,对象过期。如果此值为 0,表示对象可以无限期地存在于缓存中. 该属性值必须大于或等于timeToIdleSeconds 属性值overflowToDisk:设置基于内存的缓存中的对象数目达到上限后,是否把溢出的对象写到基于硬盘的缓存中diskPersistent 当 jvm 结束时是否持
54、久化对象 true false 默认是 falsediskExpiryThreadervalSeconds 指定专门用于清除过期对象的间线程的轮询时.测试需要引入两个 jar 包在 sr下能找到.libconcurrentbackport-util-concurrent.jar.libcommons-logging.jar.1.测试二级缓存和散装数据public void testCache() Sesses= sf.openSes();Tranion tx = ses.begranion();Customer customer = (Customer) ses.l
55、oad(Customer.class, 4); System.out.prln(customer.getAge();mit();ses.close();ses= sf.openSes();tx = ses.begranion();customer = (Customer) ses.load(Customer.class, 4); System.out.prln(customer.getAge();/ cn.c3p0.Customer1551b0 System.out.prln(customer);mit();ses.close();ses= sf.openSes();tx = ses.begr
56、anion();customer = (Customer) ses.load(Customer.class, 4); System.out.prln(customer.getAge();/ cn.c3p0.Customer1758500System.out.prln(customer); / 测试散列 是重组的对象mit();ses.close();.2.测试一级缓存更新数据会同步到二级缓存publicvoid testUpdate() SesTranses=sf.openSes();ion tx=ses.begranion();Customer customer=(Custom
57、er)ses.load(Customer.class, 4); System.out.prln(customer.getAge();customer.setAge(45);mit();ses.close();sestx=ses=sf.openSes();ion();.begrancustomer=(Customer)ses.load(Customer.class, 4);System.out.prln(customer.getAge(); mit();ses.close();/4.3.测试二级缓存的数据存放到临时目录3.3.6. 时间戳缓存区域默认的查询缓存区域以及用户自定义的
58、查询缓存区域都用于存放查询结果。而时间戳缓存区域存放了对与查询结果相关的表进行、更新或删除操作的时间戳。 Hibernate 通过时间戳缓存区域来判断被缓存的查询结果是否过期。所以,当应用程序对数据库的相关数据做了修改,Hibernate 会自动刷新缓存的查询结果。Hibernate 提供了和查询相关的缓存区域:时间戳缓存区域:.hibernate.cahce.UpdateTimestCache, 更新或删除操作的时间戳.时间戳缓存区域存放了对于查询结果相关的表进行Hibernate 通过时间戳缓存区域来判断被缓存的查询结果是否过期, 其运行过程如下:T1 时刻执行查询操作, 把查询结果存放在
59、 QueryCache 区域,为 T1T2 时刻对查询结果相关的表进行更新操作, Hibernate 把 T2 时刻存放在该区域的时间戳UpdateTimestCache 区域.T3 时 刻 执 行 查 询 结 果 前 , 先比较QueryCache 区域的时间戳和 UpdateTimestCache 区域的时间戳, 若 T2 T1, 那么就丢弃原先存放在QueryCache 区域的查询结果, 重新到数据库中查询数据, 再把结果存放到QueryCache 区域; 若 T2 T1, 直接从 QueryCache 中获得查询结果测试时间戳缓存区域/测试缓存溢出存放到临时目录 Testpublicvoid testowerFlow() Sesses=sf.openSes();Tranion tx=ses.begranion();Query qu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 港口客运与城市规划考核试卷
- 果蔬汁饮料的食品安全法规更新与合规考核试卷
- 初等教育的社会实践任务考核试卷
- 海水养殖的市场需求与产品创新实践考核试卷
- 熔炉工艺流程仿真与实践考核试卷
- 产品釆购合同标准文本
- 代理技校招生合同标准文本
- 前期物业转让合同标准文本
- 供应货品合同标准文本
- 渔业机械制造企业的人力资源管理考核试卷
- 2022年体育单招考数学试题(精校解析版)
- 成语小故事胸有成竹
- JC474-2008 砂浆、混凝土防水剂
- 一年级综合实践-集中注意力
- 《大学物理学》精美课件(全)
- 廉洁谈话一问一答简短六篇
- 能源管理员岗位责任制(4篇)
- 校服采购投标方案(技术标)
- 儿童压力性损伤评估量表与预防措施
- 垃圾清运处理方案书及报价
- 《仪器分析》完整全套教学课件(共17章)
评论
0/150
提交评论