glassfish

在我的四部分系列的第三部分中,我将说明将Coherence与EclipseLink和GlassFish结合使用的第二种策略。 这就是通过EclipseLink使用Coherence作为二级缓存(L2)的全部内容。

一般的做法

这种方法将Coherence数据网格应用于依赖于数据库托管数据的JPA应用程序,这些数据无法完全预加载到Coherence缓存中。 它可能无法预加载的一些原因包括:超出Coherence筛选器功能集的极其复杂的查询,创建陈旧缓存的第三方数据库更新,依赖于本机SQL查询,存储过程或触发器等。 这不仅是本地L2高速缓存的选项,而且在不同节点上具有其他已配置的Coherence实例,您还将获得群集范围的JPA L2高速缓存。

细节

与许多缓存一样,这是一个只读的优化。 主键查询尝试首先从Coherence获取实体,如果不成功,将查询数据库,并用查询结果更新Coherence。 针对数据库执行非主键查询,并针对Coherence检查结果,以避免缓存实体的对象构建成本。 新查询的实体将放入Coherence。 写入操作将更新数据库,如果成功提交,则将更新后的实体放入Coherence。 这种方法在Coherence文档中称为“网格缓存”。

付诸实践

如果您还没有这样做,请从上一篇博客文章开始,并准备您的环境 。 只有一件事,您需要进行更改。 对于这种情况,请返回GlassFish 3.0.1 / EclipseLink 2.0.1,因为CacheKey.getKey()方法存在问题。 2.0.1返回一个Vector ,而2.2.0返回一个Object 。 看到新的Oracle GlassFish Server 3.1支持ActiveCache,我希望此问题将在3.7 Coherence版本中得到修复。 但是直到那之前,您必须坚持使用旧的GF或EclipseLink。

无论如何,让我们使用您喜欢的IDE(例如GridCacheExample)创建一个新的Web项目。 添加所需的库(coherence.jar,toplink-grid.jar和eclipselink.jar)。 现在,让我们创建我们的实体类,并向其添加额外的@CacheInterceptor批注:

...import oracle.eclipselink.coherence.integrated.cache.CoherenceInterceptor;
import org.eclipse.persistence.annotations.CacheInterceptor;...@Entity
@CacheInterceptor(value = CoherenceInterceptor.class)
public class Employee implements Serializable {...}

不要忘记添加@GeneratedValue(strategy = GenerationType.SEQUENCE),因为这与上一个示例相反。 完成此操作后,您必须将一致性配置添加到WEB-INF / classes文件夹。 您可以从教程开始( 示例2 )。 (请注意,其中有一个错字…重复的</ backing-map-scheme>标记)。 像配置普通的基于JPA的应用程序一样,配置persistence.xml。

<persistence-unit name="GridCacheExamplePU" transaction-type="JTA"><provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/coherence</jta-data-source><properties>
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
<property name="eclipselink.logging.level" value="FINE" />
</properties></persistence-unit>

基本上就是这样。 现在,您可以测试新的L2缓存。 一个简单的servlet应该可以解决问题:

public class InsertServletPart3 extends HttpServlet {@PersistenceUnit(unitName = "GridCacheExamplePU")
EntityManagerFactory emf;@Resource
UserTransaction tx;...EntityManager em = emf.createEntityManager();tx.begin();// some loop magic
Employee employee = new Employee();employee.setFirstName("Markus");
employee.setLastName("Eisele");em.persist(employee);// some loop magic end
tx.commit();em.close();

如果您查看日志,则可以看到以下内容:

FEIN: INSERT INTO EMPLOYEE (LASTNAME, FIRSTNAME) VALUES (?, ?)bind => [Eisele, Markus]
...
FEIN: Coherence(Employee)::Put: 1 value: net.eisele.coherence.entities.Employee[ id=1 ]
...

基本上,这告诉您,实际的数据库插入是由您惯常的EclipseLink执行的。 之后,您会看到Employee对象以PK为键放置到名为Employee的Coherence Cache中。

如果现在对数据库发出查询

em.createQuery("select e from Employee e where e.lastName = :lastName").setParameter("lastName", "Eisele").getResultList();

您会看到以下内容:

FEIN: SELECT ID, LASTNAME, FIRSTNAME FROM EMPLOYEE WHERE (LASTNAME = ?)bind => [Eisele]
FEIN: Coherence(Employee)::Get: 1 result: net.eisele.coherence.entities.Employee[ id=1 ]
FEIN: Coherence(Employee)::Put: 1 value: net.eisele.coherence.entities.Employee[ id=1 ]
...

这告诉您,查询本身是针对数据库发出的,但结果针对Coherence进行了检查,以避免已经为缓存的实体构造对象。 新查询的实体将放入Coherence。 如果发出简单的PK查询:

em.find(Employee.class, 1);

输出更改为:

FEIN: Coherence(Employee)::Get: 1 result: net.eisele.coherence.entities.Employee[ id=1 ]

而且您根本看不到任何数据库查询。 就是这样:)您的缓存有效! 谢谢阅读。 敬请期待下一部分!

进一步阅读

参考: 具有GlassFish和一致性的高性能JPA –我们的JCG合作伙伴 Markus Eisele在“使用Java进行企业软件开发”博客上的 第3部分

相关文章 :
  • 具有GlassFish和一致性的高性能JPA –第1部分
  • 具有GlassFish和一致性的高性能JPA –第2部分
  • 在云中开发和测试
  • Java EE中的配置管理
  • 泄漏:Oracle WebLogic Server 12g
  • Java EE6装饰器:在注入时装饰类
  • Java教程和Android教程列表

翻译自: https://www.javacodegeeks.com/2011/11/in-this-third-part-of-my-four-part.html

glassfish

glassfish_具有GlassFish和一致性的高性能JPA –第3部分相关推荐

  1. glassfish_具有GlassFish和一致性的高性能JPA –第2部分

    glassfish 在我的四部分系列的第二部分中,我将解释将Coherence与EclipseLink和GlassFish结合使用的第一个策略.它描述了配置带有Coherence的JPA支持的Cach ...

  2. glassfish_具有GlassFish和一致性的高性能JPA –第1部分

    glassfish 您以前听说过连贯性吗? 可能是. 它是那些著名的内存网格解决方案之一,这些解决方案承诺了出色的快速数据访问和无限空间用于您经常使用的数据. 其中一些众所周知的竞争对手是Infini ...

  3. 具有GlassFish和一致性的高性能JPA –第2部分

    在我的四部分系列的第二部分中,我将解释将Coherence与EclipseLink和GlassFish一起使用的策略第一.这描述了配置Coherence的JPA支持的Cache所必须采取的步骤,以及如 ...

  4. 具有GlassFish和一致性的高性能JPA –第3部分

    在我的四部分系列的第三部分中,我将解释将Coherence与EclipseLink和GlassFish结合使用的第二种策略. 这就是通过EclipseLink使用Coherence作为二级缓存(L2) ...

  5. 具有GlassFish和一致性的高性能JPA –第1部分

    您以前听说过连贯性吗? 大概是. 它是那些著名的内存网格解决方案之一,该解决方案承诺了超快的数据访问速度和对经常使用的数据的无限空间. 一些众所周知的竞争对手是Infinispan , Memcach ...

  6. 做一个高一致性、高性能的Flutter动态渲染,真的很难么?

    Flutter动态模板渲染架构升级 ​ 最近小组在尝试使用集团DinamicX的DSL,通过下发DSL模板,实现Flutter端的动态化模板渲染.我们解决了性能方面的问题后,又面临了一个新的挑战--渲 ...

  7. jpa动态扩展sql_扩展您的JPA POJO

    jpa动态扩展sql 可扩展性是许多体系结构的重要特征. 它衡量是否容易(或困难) 它是在不影响现有核心系统功能的情况下添加或更改功能. 让我们举一个简单的例子. 假设您的公司拥有一个核心产品来跟踪体 ...

  8. 扩展您的JPA POJO

    可扩展性是许多体系结构的重要特征. 它衡量是否容易(或困难) 它是在不影响现有核心系统功能的情况下添加或更改功能. 让我们举一个简单的例子. 假设您的公司拥有一个核心产品来跟踪体育俱乐部中的所有用户. ...

  9. 从GlassFish 3.x扩展到WebLogic 12c Server

    Oracle针对GlassFish服务器的策略的主要目标之一是"与Fusion Middleware and Products集成"(来源: Community Roadmap,2 ...

最新文章

  1. 省时省事省力 巧用阿里ECS D1构建大数据处理平台
  2. 『PaddlePaddle X Wechaty』有颜又有才的Living_Bot
  3. linux oracle 创建表空间2016,Linux下Oracle表空间及用户创建
  4. how to use object based exception combined with message class in SE91
  5. 浅谈 Python 中的 __init__ 和 __new__
  6. int long long 的取值范围
  7. 使用nginx+lua脚本读写redis缓存
  8. 电视机鸿蒙os卡,开卖40天,搭载鸿蒙OS操作系统的华为电视就差评如潮?用户:亏了...
  9. html中单选怎么写,在HTML中select标签怎样实现单选和多选
  10. 阿里云,CentOS下yum安装mysql,jdk,tomcat
  11. 【转】Android实例剖析笔记(二)--用实例讲解Andriod的开发过程,以NotesList为实例介绍Android的菜单机制...
  12. 浅谈Spring中Bean的生命周期
  13. 机器学习数学基础之高数篇——函数极限和导数(python版)
  14. windows修改用户文件夹名称 更改用户名 修改C盘Users目录下文件夹名称
  15. POSTMAN中文版本
  16. 【车间调度】柔性作业车间调度问题的研究现状
  17. 小波阈值去噪c语言程序,小波阈值去噪MATLAB程序
  18. word在英文输入法的状态下,打出来的引号还是中文字符
  19. GitHub每月优秀热门项目推荐:2021年11月
  20. python 输出图像尺寸_Opencv-Python:图像尺寸、图像的读取、显示、保存与复制

热门文章

  1. 《走遍中国》珍藏版(十三)
  2. 利用命令来打开所有程序,这个装逼给满分!
  3. python常见内置函数
  4. (转)mysql查看连接客户端ip和杀死进程
  5. GET与POST传递数据的最大长度能够达到多少
  6. 单元测试junit参数_使用Junit参数在更少的时间内编写更好的单元测试
  7. c 应用程序开发框架_企业应用程序开发框架的分类
  8. java技术专家学习路线图_向Java最佳专家的全球专家学习Java
  9. Spring Bootstrap中具有配置元数据的高级配置
  10. java ee编译器_Java EE 8 MVC:控制器的详细介绍