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

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

一般的做法

这种方法将Coherence数据网格应用于依赖于无法完全预加载到Coherence缓存中的数据库托管数据的JPA应用程序。 它可能无法预加载的一些原因包括超出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 –第3部分,来自我们的JCG合作伙伴 Markus Eisele ,在“使用Java进行企业软件开发”博客中

相关文章 :
  • 具有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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接口使用时注意

interface Service{ void doSome(); //方法的默认修饰符为public abstract } public class InterfaceNote implements Service{ //方法默认的修饰符为 default void doSome(){ System.out.println("做一些服务&#xff01;"); } public static void main(String…

【Hexo】deploy出错的解决方法

1、ERROR Deployer not found: git 执行npm install hexo-deployer-git --save 2、$ hexo d INFO Deploying: git INFO Clearing .deploy_git folder... INFO Copying files from public folder... fatal: Not a git repository (or any of the parent directories): .git F…

精选30道Java笔试题解答(转)

都是一些非常非常基础的题&#xff0c;是我最近参加各大IT公司笔试后靠记忆记下来的&#xff0c;经过整理献给与我一样参加各大IT校园招聘的同学们&#xff0c;纯考Java基础功底&#xff0c; 老手们就不用进来了&#xff0c;免得笑话我们这些未出校门的孩纸们&#xff0c;但是I…

list取值_Redis中List及quicklist实现-2

上一篇中看了List的使用方式、quicklist中的各个结构体&#xff0c;这一篇来看看quicklist里面的几个核心函数&#xff0c;quicklistCreate函数、quicklistCreateNode函数、quicklistPush函数、quicklistPop函数。接下来我们通过源码看一下quicklist中是如何借鉴STL中deque的这…

通过示例休眠–第1部分(删除孤儿)

所以我想做一系列的冬眠例子&#xff0c;展示冬眠的各种特征。 在第一部分中&#xff0c;我想展示有关删除孤儿功能及其在故事情节中的使用方法。 因此&#xff0c;让我们开始:) 先决条件 &#xff1a; 为了尝试以下示例&#xff0c;您将需要以下提到的JAR文件&#xff1a; …

站长工具--IP地址库

中国最全的IP地址库 转载于:https://www.cnblogs.com/weloveshare/p/5783438.html

String使用注意一

public class StringNote{ public static void main(String[] args){ char[] c{h,e,l,l,o}; String str1new String(c); String str2new String(c); String str3"hello"; //常量池中有 “hello” 字符串&#xff0c;str3和str4分别指向他 String str4"…

Win10手记-IIS部署网站问题解决

最近在自己的Win10电脑上尝试部署ASP.NET网站时出现了问题&#xff0c;经过多方查找定位到IIS为问题来源。 开始之前 先描述下技术环境&#xff1a; 1.Windows 10 PC 2.Windows 自带的IIS 7 3.ASP.NET Web API项目网站 4.VS 2015 问题描述 首先我们为PC安装IIS&#xff0c;按照…

python随机数生成的方法_python生成随机数的方法

一、概述python可以通过random包来产生随机数或者执行一些随机操作。1. random.seed()给定一个数据作为随机数种子&#xff0c;和大多数语言一样&#xff0c;python也可以使用时间来作为随机数种子。import timetime.seed(time.time())12importtimetime.seed(time.time())2. ra…

Java模块化方法–模块,模块,模块

我认为每个人都会同意&#xff0c;编写模块化应用程序和模块化通常是一件好事。 但是&#xff0c;从Java和Scala语言以及各种Java / Scala框架来看&#xff0c;对模块化的支持是怎样的呢&#xff1f; 有很多不同的方法&#xff01; 让我们看看其中的一些。 “保护”以下是指模块…

CentOS 7 安装记录

由于centos6.4版本有点老&#xff0c;所以换到centos7。 1.安装 CentOS 7.0系统安装配置图解教程 2.linux设置网卡开机启动 实质linux是看一个网卡文件的配置&#xff0c;就是/etc/sysconfig/network-scripts/ifcfg-eth0 (这个文件名看你网卡名称而异&#xff0c;具体你到该目录…

String使用注意二

public class StringNote_1{ public void fun(){ for(int i1;i<100;i){ System.out.print(i""); //此语句很耗时间影响性能 } System.out.println("100"); } public void fun1(){ String text""; for(int i1;i<100;i){ …

python2clock_控制fps的时钟Clock类源码

"""控制fps的时钟Clock类&#xff0c;本程序用来在循环中控制fps。如何在海龟画图中控制fps&#xff1f;这是一个比较重要的问题&#xff0c;否则程序可能有时候快有时候慢。"""import timeimport colorsysfrom turtle import *from random impo…

将mysql的data目录移走方法

如移动到"/home/mysql/data"&#xff0c;我的mysql是装在/usr/local/mysql下的 1. 将/usr/local/mysql/data移动到/home/mysql/data mv /usr/local/mysql/data /home/mysql/data 2. 修改启动文件 vi /usr/local/mysql/support-files/mysql.server 修改如下行&#xf…

Integer注意_享元设计模式

public class IntegerNote{ public static void main(String[] args){ Integer d1100; Integer d2100; System.out.println(d1d2); //true Integer d3129; Integer d4129; System.out.println(d3d4); //false } } /* 究其原因则涉及到java设计中的一个设计模式&am…

使用Spring 3引导Web应用程序

1.概述 这是关于使用Spring 3.1和基于Java的配置来建立RESTfull Web应用程序的系列教程的第一篇。 本文将重点介绍如何引导Web应用程序 &#xff0c;讨论如何从XML过渡到Java&#xff0c;而不必完全迁移整个XML配置。 2. Maven <project xmlns"http://maven.apache.o…

通知栏发送消息Notification(可以使用自定义的布局)

一个简单的应用场景&#xff1a;假如用户打开Activity以后&#xff0c;按Home键&#xff0c;此时Activity 进入-> onPause() -> onStop() 不可见。代码在此时机发送一个Notification到通知栏。当用户点击通知栏的Notification后&#xff0c;又重新onRestart() -> onSt…

退出页面删除cookie_Cookie 机制

欢迎关注公众号 学习资料不会少01「HTTP 协议是无状态的」对于浏览器的每一次请求&#xff0c;服务器都会独立处理&#xff0c;不与之前或之后的请求发生关联。这个过程如图 11-1 所示&#xff0c;3次“请求&#xff0f;响应”之间没有任何关系。即使是同一个浏览器发送了3个请…

【程序员感悟系列】 由一点业务说开去

最近的工作不是很忙&#xff0c;我也趁着这个机会多读了一些技术的书籍。比如刚读完的《大话设计模式》&#xff0c;以将故事的形式讲述了设计模式的方方面面&#xff0c;感觉还是不错的。现在看的一本是英国人写的《企业应用架构模式》。对于web的企业级应用&#xff0c;还是挺…

浮点数使用注意

public class DoubleNote{ public static void main(String[] args){ System.out.println((1.0-0.8)); //结果&#xff1a; 0.19999999999999996 //浮点数“”要慎用 System.out.println((1.0-0.8)0.2)); // false } } /* Java 浮点数表示采用IEE765表示法 */