JPA的有2个缓存的水平。第一级的缓存是持久化上下文。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_1a626cf3-cf6a-a47a-4d7a-99cc03f60515.png)
JPA实体管理器保持在持久化上下文管理的实体集合。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_e041b23f-a690-9cd1-1448-403db972bb8c.png)
实体管理保证在一个持久化上下文,对于任何特定的数据库行,将只有一个对象的实例。然而,同一个实体可以在其他用户进行管理的事务,所以你就应该用乐观或悲观锁定在解释的JPA 2.0并发和锁定
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_f2c99048-1887-43f0-8e8a-2052edc6cf34.png)
下面的代码的情况下显示,找到一个相同的持久性管理实体,和相同的ID中的另一个类,将返回相同的实例。
@无国籍公共ShoppingCartBean实现的ShoppingCart(
@ PersistenceContext注解的EntityManager EntityManager的;
公共订购行createOrderLine(产品生产,订单顺序)(
订单行订购行=新行(秩序,产品);
entityManager.persist(订单行); / /托管
订单行orderLine2 = entityManager.find(订单行,
orderLine.getId ()));
(订单行== orderLine2)/ /真
收益率(订单行);
)
)
下图显示了一个有关持久性语境下的实体生命周期。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_9eeefe09-55f8-60b1-f997-ad0febec70a4.png)
下面的代码说明了一个实体的生命周期。容器托管的EntityManager参考使用注入持久化上下文的诠释。一个是创建新秩序的实体和实体具有新的境界。坚持叫,使之成为一个管理的实体。因为它是一个无状态会话bean它是由容器管理的事务默认使用,当事务提交时,该命令是由数据库中的持久性。当订单行返回的实体在实体年底的交易是一个脱节。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_09ee75ed-8a14-1637-a882-f2ceac4c78c0.png)
持久性上下文可以是事务范围-持久性上下文的生命'为扩展长度的交易,或-持久性上下文跨越多个交易。随着交易范围的持久化上下文,实体是“超脱”于交易结束了。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_35a1fc4e-c824-bcba-4658-aa91e8d7f8e9.png)
如下图所示,坚持独立实体的变化对一,调用EntityManager的合并()操作,它返回一个更新管理的实体,该实体更新将持续到数据库在事务结束的。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_1ef41c9a-47a0-c1ca-e690-bcfbdfc5b138.png)
一种扩展的持久化上下文跨越多个交易,以及语境设置实体的持久逗留托管。这可能是有用的一个场景,一个工作流程“对话请求”与用户跨越多个。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_fac2f7cb-eec5-b665-70ef-3a6a5d612bb8.png)
下面的代码显示了会议的范围内的EJB的持久性与扩展的命令行项目为例,一个在用状态情况下补充。该命令后的方法是坚持在createOrder,但它仍然管理,直到EJB删除方法被调用。在addLineItem方法,令实体可以被更新,因为它是管理,更新将坚持在该交易结束。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_b74ce8a0-8e10-cf67-a432-9c008e7b111a.png)
下面的例子对比更新订购使用事务范围的持久化上下文诗句一个扩展持久化上下文。随着交易范围的持久性方面,一个实体管理器找到必须做的查找命令,它返回一个管理的实体,可以进行更新。随着扩展持久化上下文的发现是没有必要的。该数据库的性能优势没有做读来查找实体,必须权衡缓存的内存消耗对缺点和实体交易风险缓存被更新另一个。根据不同的应用程序和并行风险之间的争夺这一交易可能会或可能不会提供更好的性能/可扩展性。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_c13f31cb-850a-77a4-7393-983b43b7fbdc.png)
JPA的第二层(L2)的缓存
JPA的第二层(L2)的缓存的持久化上下文的股票在各个实体的状态。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_a82b5405-7ae1-8764-37c8-3a9dcb5d5d41.png)
没有指定的JPA 1.0缓存支持第二个层次,但是,大多数供应商提供的持续的支持第二级缓存()。 2.0指定运营支持JPA的基本缓存与新的缓存API,这是EntityManagerFactory的可从以下所示:
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_8bfe8570-22ac-5905-985c-f8b90f6b7348.png)
如果启用了二级缓存,在没有找到实体的持久化上下文,将被载入由二级高速缓存,如发现。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_b55395bc-9b86-fbcd-e786-e1e6f002481d.png)
二级缓存的优点是:
· 避免数据库已加载实体访问
· 更快的读取频繁访问的未修改的实体
二级缓存的缺点是:
· 内存消耗大量的对象
· 为更新陈旧的数据对象
· 并发写(乐观锁定异常,或者悲观锁定)
· 可扩展性差的频繁更新的实体或兼任
您应该配置为实体的二级缓存:
· 经常读
· 修改很少
· 不是很关键,如果过期
你应该保护任何一个可以同时锁定策略修改后的数据:
· 必须处理好冲洗/提交乐观锁失败
· 配置过期,刷新失败的政策,以减少锁
查询缓存对于那些具有相同的运行参数经常查询很有用,不修改表。
该缓存的EclipseLink的JPA持久性提供建筑
该建筑的EclipseLink缓存如下。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_6a0a29f4-da5d-82cc-4fbf-d92d34a57604.png)
的EclipseLink支持第二级缓存中打开默认的对,实体读的二级缓存。您可以禁用的L2缓存。实体的EclipseLink二级缓存,Hibernate的二级缓存实体ID和国家研究。您可以配置缓存参数由以下实体类型配置或持久性单元的:
· 缓存隔离,类型,大小,到期,协调,失效,刷新
· 协调(集群通讯)
· 消息:的JMS,RMI公司,RMI - IIOP的,...
· 模式:同步,同步+新的,无效的,无
下面的配置为使用@缓存实体的注解二级缓存的例子所示
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_ad86cbfe-e420-7d7e-b2d6-bee0e091c32a.png)
Hibernate的缓存体系结构的JPA持久性提供
Hibernate的JPA的持久性提供不同的缓存架构的EclipseLink比:它不是默认配置,它不缓存enities只是ID和状态,你可以插入不同的L2缓存。下面的图表显示了不同的二级缓存类型,您可以插入休眠。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_9595941e-99ba-fe27-993d-f092d0a011aa.png)
缓存配置的缓存依赖于类型插上电源注释下面的例子缓存实体使用@显示配置一个休眠的L2高速缓存
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_797c7aee-4ed4-e64a-948e-fc952ba74950.png)
JPA的有2个缓存的水平。第一级的缓存是持久化上下文。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_eac1bcd8-ebf9-a781-7e0c-69b07291efe5.png)
JPA实体管理器保持在持久化上下文管理的实体集合。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_487d6dc0-a76e-49dc-d08f-de6ab78edfa4.png)
实体管理保证在一个持久化上下文,对于任何特定的数据库行,将只有一个对象的实例。然而,同一个实体可以在其他用户进行管理的事务,所以你就应该用乐观或悲观锁定在解释的JPA 2.0并发和锁定
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_93c856ce-f75a-579f-d01d-0137a0b72026.png)
下面的代码的情况下显示,找到一个相同的持久性管理实体,和相同的ID中的另一个类,将返回相同的实例。
@无国籍公共ShoppingCartBean实现的ShoppingCart(
@ PersistenceContext注解的EntityManager EntityManager的;
公共订购行createOrderLine(产品生产,订单顺序)(
订单行订购行=新行(秩序,产品);
entityManager.persist(订单行); / /托管
订单行orderLine2 = entityManager.find(订单行,
orderLine.getId ()));
(订单行== orderLine2)/ /真
收益率(订单行);
)
)
下图显示了一个有关持久性语境下的实体生命周期。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_42b0c321-dc12-94ac-6798-9a5423a3d46f.png)
下面的代码说明了一个实体的生命周期。容器托管的EntityManager参考使用注入持久化上下文的诠释。一个是创建新秩序的实体和实体具有新的境界。坚持叫,使之成为一个管理的实体。因为它是一个无状态会话bean它是由容器管理的事务默认使用,当事务提交时,该命令是由数据库中的持久性。当订单行返回的实体在实体年底的交易是一个脱节。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_420dc7f3-1bd3-5359-41c9-99cc8d42b1f5.png)
持久性上下文可以是事务范围-持久性上下文的生命'为扩展长度的交易,或-持久性上下文跨越多个交易。随着交易范围的持久化上下文,实体是“超脱”于交易结束了。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_017215b7-b2dd-ee8e-352b-d953b55e178d.png)
如下图所示,坚持独立实体的变化对一,调用EntityManager的合并()操作,它返回一个更新管理的实体,该实体更新将持续到数据库在事务结束的。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_004edf8c-3c6b-b647-93c0-1a4a3f9711ab.png)
一种扩展的持久化上下文跨越多个交易,以及语境设置实体的持久逗留托管。这可能是有用的一个场景,一个工作流程“对话请求”与用户跨越多个。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_7641e1a3-eefb-bb75-b8e6-177fe5923aaf.png)
下面的代码显示了会议的范围内的EJB的持久性与扩展的命令行项目为例,一个在用状态情况下补充。该命令后的方法是坚持在createOrder,但它仍然管理,直到EJB删除方法被调用。在addLineItem方法,令实体可以被更新,因为它是管理,更新将坚持在该交易结束。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_44ac1e0a-4763-1cb1-685a-774472e5d023.png)
下面的例子对比更新订购使用事务范围的持久化上下文诗句一个扩展持久化上下文。随着交易范围的持久性方面,一个实体管理器找到必须做的查找命令,它返回一个管理的实体,可以进行更新。随着扩展持久化上下文的发现是没有必要的。该数据库的性能优势没有做读来查找实体,必须权衡缓存的内存消耗对缺点和实体交易风险缓存被更新另一个。根据不同的应用程序和并行风险之间的争夺这一交易可能会或可能不会提供更好的性能/可扩展性。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_df3e5c00-d55b-a7f2-0db6-0c5e5e0a98a7.png)
JPA的第二层(L2)的缓存
JPA的第二层(L2)的缓存的持久化上下文的股票在各个实体的状态。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_b3b88303-5c9d-2af5-05ae-0bc5920d0957.png)
没有指定的JPA 1.0缓存支持第二个层次,但是,大多数供应商提供的持续的支持第二级缓存()。 2.0指定运营支持JPA的基本缓存与新的缓存API,这是EntityManagerFactory的可从以下所示:
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_3d7ca943-8c2a-cc86-6d4d-d6c8e1c330ef.png)
如果启用了二级缓存,在没有找到实体的持久化上下文,将被载入由二级高速缓存,如发现。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_b1c54c27-cb2e-1a06-4230-9e04026b5dcb.png)
二级缓存的优点是:
· 避免数据库已加载实体访问
· 更快的读取频繁访问的未修改的实体
二级缓存的缺点是:
· 内存消耗大量的对象
· 为更新陈旧的数据对象
· 并发写(乐观锁定异常,或者悲观锁定)
· 可扩展性差的频繁更新的实体或兼任
您应该配置为实体的二级缓存:
· 经常读
· 修改很少
· 不是很关键,如果过期
你应该保护任何一个可以同时锁定策略修改后的数据:
· 必须处理好冲洗/提交乐观锁失败
· 配置过期,刷新失败的政策,以减少锁
查询缓存对于那些具有相同的运行参数经常查询很有用,不修改表。
该缓存的EclipseLink的JPA持久性提供建筑
该建筑的EclipseLink缓存如下。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_4cef1ca8-4ac6-08bc-acb9-fe7ce674bf2b.png)
的EclipseLink支持第二级缓存中打开默认的对,实体读的二级缓存。您可以禁用的L2缓存。实体的EclipseLink二级缓存,Hibernate的二级缓存实体ID和国家研究。您可以配置缓存参数由以下实体类型配置或持久性单元的:
· 缓存隔离,类型,大小,到期,协调,失效,刷新
· 协调(集群通讯)
· 消息:的JMS,RMI公司,RMI - IIOP的,...
· 模式:同步,同步+新的,无效的,无
下面的配置为使用@缓存实体的注解二级缓存的例子所示
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_81cdae48-3402-09e7-6187-686460ccf124.png)
Hibernate的缓存体系结构的JPA持久性提供
Hibernate的JPA的持久性提供不同的缓存架构的EclipseLink比:它不是默认配置,它不缓存enities只是ID和状态,你可以插入不同的L2缓存。下面的图表显示了不同的二级缓存类型,您可以插入休眠。
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_4df05872-a10c-a6f5-169b-53131a4149ae.png)
缓存配置的缓存依赖于类型插上电源注释下面的例子缓存实体使用@显示配置一个休眠的L2高速缓存
![](http://www.reremouse.com:80/word_images/6f2b5e00-2696-4f7e-aca0-678d672f453f_52e13db7-9edc-1aa7-5be8-3fae0ecbdfb4.png)
|
|