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

glassfish

在我的四部分系列的第二部分中,我将解释将Coherence与EclipseLink和GlassFish结合使用的第一个策略。它描述了配置带有Coherence的JPA支持的Cache所必须采取的步骤,以及如何在GlassFish中使用它。高性能数据存储。

一般的做法

您可以将Coherence API与通过JPA映射的数据库支持的缓存一起使用。 网格通过JPA CacheLoader和CacheStore实现访问关系数据。 在这种“传统”一致性方法中,TopLink Grid提供了针对EclipseLink JPA优化的CacheLoader和CacheStore实现。 (EclipseLinkJPACacheLoader和EclipseLinkJPACacheStore)都包含在toplink-grid.jar文件中。 这样,您将使用标准的JPA运行时配置文件persistence.xml和JPA映射文件orm.xml。 必须指定Coherence缓存配置文件coherence-cache-config.xml来覆盖默认的Coherence设置并定义CacheStore缓存方案。

细节

CacheLoader实现通过EclipseLink将所有读取操作/查询直接重定向到数据库。 CacheStore负责使用EclipseLink对数据库执行的所有写入操作(插入,更新,删除)。 该解决方案基本上独立于GlassFish及其JPA提供程序。 您只需将Coherence与它的本机API一起使用,并且Coherence负责持久化实体。 该方法在文档中称为“传统相干配置”。

制备

为了使该示例和以下每个示例都能正常工作,我们需要做一些准备。 首先是获得所有必需的软件。 获得Java SE开发套件6u23 , GlassFish 3.1(NetBeans的一部分) , MySQL Community Server(5.5.9) , TopLink(11.1.1.4.0)和Coherence( 3.6.1.0)的副本 。 任何IDE都可以。 我将所有示例都基于NetBeans 7.0 Beta2 。 您应该首先安装零碎的零件。 使用MySQL创建一个空的“一致性”数据库。 我们将在所有示例中使用此示例。 我不会指导您完成此操作。 我将从相关的一致性部分开始。 这也是您需要遵循本系列其他部分的配置。 所以你最好保留它;)

将您的Coherence下载文件解压缩到合适的位置(例如x:\ Oracle \ coherence \),然后通过设置并运行示例缓存服务器应用程序来检查安装。 转到\ bin文件夹,然后执行cache-server.cmd / sh。 在此之前,请确保JAVA_HOME变量指向有效的JDK安装。 如果一切顺利,您将收到消息:“ Started DefaultCacheServer…”。 一个简单的旁注:一致性是群集感知的。 这意味着,它将自动尝试发现子网中其他正在运行的Coherence节点。 如果您看到除“ ActualMemberSet = MemberSet(Size = 1)”以外的其他输出,则应在此处停止并将Coherence配置为仅在计算机上运行 。太好了,所有设置。让我们执行示例客户端。启动coherence.cmd / sh并等待输出“ Map(?):”。如果您使用服务器控制台进行检查,将看到以下内容:

(thread=Cluster, member=1): Member 2 joined Service Management with senior member 1

试一试,然后尝试以下命令,每个命令都以返回确认:帮助,缓存myCache,输入消息“ hello”,获取消息,大小,列表,再见。 要获得更多帮助,请查阅教程 。

付诸实践

使用NetBeans启动一个新的Java / Java类库项目。 将其命名为“ GridEntityExample”(选中专用的lib文件夹框)。 将coherence.jar,toplink-grid.jar和mysql-connector-java-5.1.13-bin.jar添加到lib文件夹,并将它们添加到项目依赖项中。

添加两个新的程序包实体和服务器(例如net.eisele.coherence.entities,net.eisele.coherence.server)和

由于我们已经有了高速缓存服务器示例,因此很容易对其进行修改以满足我们的需求。 将新的实体类(员工)添加到实体包中。 将主键类型更改为“ int”,然后单击下一步。 从下拉框中选择EclipseLink JPA 2.0。 由于向导将不允许您完成操作,因此请创建一个新的数据库连接(jdbc:mysql:// localhost:3306 / coherence),然后单击完成。 将两个私有字符串(firstName,lastName)及其获取器和设置器添加到实体。 从id属性中删除@GeneratedValue(稍后会详细介绍)。 persistence.xml中的一些调整完成了配置。 添加以下内容:

<property name="eclipselink.ddl-generation" value="create-tables" />
<property name="eclipselink.ddl-generation.output-mode"
value="database" />            
<property name="eclipselink.jdbc.read-connections.min" value="1" />
<property name="eclipselink.jdbc.write-connections.min" value="1" />
<property name="eclipselink.jdbc.batch-writing" value="JDBC" />
<property name="eclipselink.logging.level" value="FINE" />
<property name="eclipselink.logging.thread" value="false" />
<property name="eclipselink.logging.session" value="false" />
<property name="eclipselink.logging.exceptions" value="false" />
<property name="eclipselink.logging.timestamp" value="false"/>

现在,我们需要一个简单的StartCacheServer类,该类应抵抗服务器软件包。 给它一个简单的主要方法:

public static void main(String[] args) throws UnknownHostException {
// Restrict Coherence to localhost
System.setProperty("tangosol.coherence.wka", InetAddress.getLocalHost().getHostAddress());// Start CacheServer
DefaultCacheServer.main(new String[0]);
}

现在我们必须配置一致性。 这是通过coherence-cache-config.xml文件完成的。 完整的文件可以在教程中找到 。 成功的关键是class方案的第二个init参数。 您必须从那里的persistence.xml引用持久性单元:

<init-param>
<param-type>java.lang.String</param-type>
<param-value>GridEntityExamplePU</param-value>
</init-param>

右键单击StartCacheServer并运行它。 您应该看到已经知道的消息:“ Started DefaultCacheServer…”。

好。 现在,我们将第一位员工插入数据库。 创建一个简单的InsertExample类:

public static void main(String[] args) throws UnknownHostException {
// Restrict Coherence to localhost
System.setProperty("tangosol.coherence.wka", InetAddress.getLocalHost().getHostAddress());// Disable local storage--need to start independent CacheServer
System.setProperty("tangosol.coherence.distributed.localstorage", "false");// Get the configured Cache 
NamedCache cache = CacheFactory.getCache("Employee");//Create a new Employee
Employee emp = new Employee();
emp.setFirstName("Markus");
emp.setLastName("Eisele"); 
emp.setId(1);//Put the Employee into the cache
cache.put(1, emp);
}

运行它并检查您的数据库,是否有新创建的Employee。 它应该是 :)

做完了 就这样。 好的,GlassFish部分到底在哪里?

在GlassFish中使用此方法

这很简单。 创建一个新的域(我们称其为一致性),并创建一个新的WebApplication(将其称为GridEntityWeb)。 添加GridEntityExample项目和coherence.jar作为依赖项。 现在,您必须配置缓存。 再次通过coherence-cache-config.xml完成​​。 在WEB-INF / classes中创建一个,并使其引用EclipseLinkJPA服务名称。

<cache-config><caching-scheme-mapping>
<cache-mapping>
<cache-name>*</cache-name>
<scheme-name>distributed-eclipselink</scheme-name>
</cache-mapping>
</caching-scheme-mapping><caching-schemes>
<distributed-scheme>
<scheme-name>distributed-eclipselink</scheme-name>
<service-name>EclipseLinkJPA</service-name>
</distributed-scheme>
</caching-schemes></cache-config>

就这样。 确保StartCacheServer正在运行,并启动GlassFish域和应用程序。 如果仅从InsertExample中复制几行,则可以快速测试一切是否正常。 现在剩下要做的就是找到一种干净的方法将其集成到您的应用程序中。 也许您可以提出一个通用的Coherence Crud服务(可能基于Adam的建议 )。

缺点和想法

使用这种方法时,必须配置持久性单元,以确保在插入或更新实体时不对实体进行任何更改。 JPA提供程序对实体所做的任何更改都不会反映在Coherence缓存中。 这意味着高速缓存中的实体将与数据库内容不匹配。 特别是,实体不应使用ID生成(例如@GeneratedValue)来获取ID。 这意味着,为了将对象插入Coherence缓存中,您还需要提供其身份作为键。

ID通常是实体存储在Coherence中的密钥。 不应使用乐观锁定(例如,@ Version),因为它可能导致数据库事务提交失败。

因此,总的来说,这并不是一种真正通用的方法,它仅适用于一些要处理大量数据的特殊情况。

但是这里到底是什么交易。 让我们看看:如果您循环运行配置的示例并插入12.635 Employee对象,则在我的计算机上大约需要13分钟。 如果在同步模式下运行Coherence,则会发生这种情况。 但是您可以利用称为“后写”的功能通过异步执行数据库更新来缩短应用程序响应时间。 如果将一行添加到CacheServer的coherence-cache-config.xml:

<write-delay>10s</write-delay>

从应用程序角度出发,插入插件所需的时间减少到9秒! 当然,运行中的服务器仍然需要时间异步处理更新,但是对于客户端而言,这是最佳行为。

现在足够了。 我将尝试通过示例逐步解释更多概念。 正如您可能已经猜到的,是否使用缓存有很多要知道的地方。 下一部分将介绍Coherence作为带有GlassFish的EclipseLink的L2缓存。 谢谢阅读。 敬请关注。

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

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

翻译自: https://www.javacodegeeks.com/2011/11/high-performance-jpa-with-glassfish-and_03.html

glassfish

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

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

相关文章

java开发一个连连看小游戏

导读:连连看是一种消除类益智游戏,核心要求是在规定的时间内,消除游戏界面中选中的两张相同的图案,直至完全消除所有图案。这款游戏操作简单(只需单击鼠标左键操作)、面向人群广泛,在限时操作的游戏要求下,吸引玩家自发地锻炼观察能力、判断能力和反应能力,故从推出至今…

将java.util.concurrent.BlockingQueue用作rx.Observable

在Java中&#xff0c;经典的生产者&#xff0d;消费者模式相对简单&#xff0c;因为我们有java.util.concurrent.BlockingQueue 。 为了避免繁忙的等待和容易出错的手动锁定&#xff0c;我们只需利用put()和take() 。 如果队列已满或为空&#xff0c;它们都将阻塞。 我们需要的…

Mac OS X 10.10如何打开虚拟内存

转载请注明出处&#xff1a;http://www.cnblogs.com/blazer/p/5103608.html 禁用虚拟内存sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist删除交换文件sudo rm /private/var/vm/swapfile*启用虚拟内存sudo launchctl load -w /System/L…

java 1.5.0 gcj_CentOS安装JAVA后JAVA版本不对的问题

今天用CentOS安装JDK&#xff0c;发觉在安装完成后&#xff0c;输入java命令来验证是否安装成功时&#xff0c;出现Usage: gij [OPTION] ... CLASS [ARGS] ...to invoke CLASS.main, orgij -jar [OPTION] ... JARFILE [ARGS] ...to execute a jar fileTry gij --help‘ for mor…

java开发一款模拟写字板系统

导读:目前,很多新的技术领域都涉及到了Java语言,Java语言是面向对象编程,并且涉及到网络、多线程等重要的基础知识,因此Java语言也是学习面向对象编程和网络编程的首选语言。此简易JAVA写字板程序,使用Java程序编写,能够进行输入文字操作,并具有新建文件,打开文件,保…

java枚举的特点_Java中有些好的特性(二):枚举

前言我在写上一篇时&#xff0c;开始选了一个很土的名字“Java超过C#的地方”&#xff0c;然后引起了某些同学的不满&#xff0c;后来修改了个名。我在这里再次申明一下&#xff0c;我没有贬低任何语言之意&#xff0c;纯粹是从一个.NET程序员的角度去看Java&#xff0c;看看是…

java开发一款推箱子游戏

导读:社会在进步,人们生活质量也在日益提高。高强度的压力也接踵而来。社会中急需出现新的有效方式来缓解人们的压力。此次设计符合了社会需求,Java推箱子游戏可以让人们在闲暇之余,体验游戏的乐趣。具有操作简单,易于上手的特点。 推箱子游戏的玩法十分简单——控制人物绕…

java ee技术_Java EE 6与Spring Framework:技术决策过程

java ee技术在过去的几个月中&#xff0c;我们经历了这个决策过程&#xff1a;为Java平台上的企业开发选择哪种技术堆栈&#xff1f; 有多种选择。 但是&#xff0c;我们深入讨论的是&#xff1a;纯Java EE 6堆栈与带有Java EE的Spring。 以下博客文章总结了当您考虑这些技术堆…

java获取系统当前时间格式化_java 获取系统当前时间并格式化

java 获取系统当前时间并格式化CreateTime--2018年5月9日11:41:00Author:Marydon实现方式有三种updateTime--2018年7月23日09点32分准备工作&#xff1a;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;方式一&#xff1a;/*** 获取系统当…

并行和并发

并行:同时运行,从微观的角度讲 并发:同时发生,从宏观的角度讲 并行是真正意义上的同时执行。而并发不是。 “并行”是指无论从微观还是宏观&#xff0c;二者都是一起执行的&#xff0c;就好像两个人各拿一把铁锨在挖坑&#xff0c;一小时后&#xff0c;每人一个大坑。 而“并发…

java 本地方法栈_Java虚拟机栈和本地方法栈

Java虚拟机栈的特征线程私有后进先出(LIFO)栈存储栈帧&#xff0c;支持Java方法的调用、执行和退出可能出现OutOfMemoryError异常和StackOverflowError异常Java本地方法栈的特征线程私有后进先出(LIFO)栈作用是支撑Native方法的调用、执行和退出可能出现OutOfMemoryError异常和…

如何使用Java,Maven,Jetty创建Web应用程序项目

在本文中&#xff0c;我们使用Maven Archetype插件创建一个简单的Web应用程序。 我们将在名为Jetty的Servlet容器中运行此Web应用程序&#xff0c;添加一些依赖项&#xff0c;编写简单的Servlet&#xff0c;并生成WAR文件。 在本文的最后&#xff0c;您还可以在Tomcat中部署该服…

java开发一款坦克大战游戏

导读:随着人们对生活质量的要求一天比一天高,为了让人们更好地开掘自身的智慧,游戏就此进入了大众的视野,在人们的生活中有着重要的位置,已然变得必不可少。游戏产业推动高新技术不断升级,极大地促进了经济的增长,推动了“第四产业”的经济腾飞。坦克大战游戏是童年时期…

java大转盘抽奖概率算法_幸运大转盘抽奖 抽奖算法 程序实现逻辑

近期碰到的一个需求&#xff0c;实现一个类似大转盘抽奖的功能&#xff0c;需自定义奖项&#xff0c;各奖项中奖概率&#xff0c;当日抽奖最大次数&#xff0c;抽奖成本等。分享一个简单的java代码的实现的思路&#xff0c;有不足之处感谢各位指正。初步方法首先要定义几个奖品…

java开发银行柜员业务绩效考核系统

导读:当今社会己进入信息社会时代,信息己经受到社会的广泛关注,被看作社会和科学技术发展的三大支柱(材料、能源、信息)之一。信息是管理的基础,是进行决策的的基本依据。在一个组织里,信息己作为人力、物力、财力之外的第四种能源,占有重要的地位。然而,信息是一种非…

mysql orderby count_mysql中count(),groupby,orderby使用方法分享

本文主要和大家分享mysql中count(), group by, order by使用方法&#xff0c;mysql中order by 排序查询、asc升序、desc降序&#xff0c;group by 分组查询、having 只能用于group by子句、作用于组内&#xff0c;having条件子句可以直接跟函数表达式。使用group by 子句的查询…

一文教你使用java开发一款坦克大战游戏

导读&#xff1a;随着人们对生活质量的要求一天比一天高&#xff0c;为了让人们更好地开掘自身的智慧&#xff0c;游戏就此进入了大众的视野&#xff0c;在人们的生活中有着重要的位置&#xff0c;已然变得必不可少。游戏产业推动高新技术不断升级&#xff0c;极大地促进了经济…

Java 8流中的常见SQL子句及其等效项

功能编程允许使用通用语言进行准声明性编程 。 通过使用功能强大的流畅API&#xff08;例如Java 8的Stream API &#xff09;或jOOλ的顺序Stream扩展Seq或更复杂的库&#xff08;例如javaslang或functionaljava&#xff09; &#xff0c;我们可以以一种非常简洁的方式来表示数…

php开启openssl的方法

windows下开启方法&#xff1a; 1&#xff1a; 首先检查php.ini中&#xff1b;extensionphp_openssl.dll是否存在&#xff0c; 如果存在的话去掉前面的注释符‘&#xff1b;’&#xff0c; 如果不存在这行&#xff0c;那么添加extensionphp_openssl.dll。 2&#xff1a; 讲php文…

mysql 短时大连接的问题_mysql长连接和短连接的问题

什么是长连接&#xff1f;其实长连接是相对于通常的短连接而说的&#xff0c;也就是长时间保持客户端与服务端的连接状态。通常的短连接操作步骤是&#xff1a;连接-》数据传输-》关闭连接&#xff1b;而长连接通常就是&#xff1a;连接-》数据传输-》保持连接-》数据传输-》保…