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

在我的四部分系列的第二部分中,我将解释将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

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

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

相关文章

arm板telnetd为什么运行不了_一种基于ARM的嵌入式系统开发的方案详细讲解

背景介绍在日益信息化的社会中&#xff0c;各种各样的嵌入式系统已经全面渗透到日常生活的每一个角落。嵌入式系统的功能越来越复杂&#xff0c;这就使得一个嵌入式系统产品从市场需求立项到方案选择、样机研制、定型量产所需要的开发费用越来越多&#xff0c;所需开发时间越来…

反素数 -- 数学

反素数就是区间内约数个数最多的那个数。 在ACM题目里&#xff0c; 一般是求约数最多而且数字最小的那个数&#xff0c;【1--n】 二是求约数刚好等于n的最小的那个数 三是求区间里的最小反素数【beign&#xff0c;end】 1和3有区别吗&#xff1f;有&#xff0c;1可以加速&#…

编程挑战系统的输入和输出详细说明

在高校俱乐部线上编程挑战中&#xff0c;一道题目的所有测试数据是放在一个文本文件中&#xff0c;选手将一道题目的程序提交给评判系统运行&#xff0c;程序从该文件中读取测试数据&#xff0c;再把运行结果输出到另一个文本文件中。系统把输出文件与标准答案比对&#xff0c;…

上传文件---未能找到路径“D:\MyProject\Files\”的一部分

C# 使用控件FileUpload 上传文件&#xff0c;简单实例&#xff1a; protected void btnUpload_Click(object sender, EventArgs e){string path Server.MapPath("~/Files/");if (fileUpload.HasFile true){string filename fileUpload.FileName.ToLower();fileUpl…

使用SPANN方式将Spring&Quartz与自定义注释集成

在上一篇文章中 &#xff0c;我们演示了如何在Spring容器中创建和配置带批注的Quartz作业。 我们使用了一个类级别的注释将一些元数据添加到实现Quartz Job的bean中。 批注定义了作业的名称&#xff0c;组及其cron表达式。 后来&#xff0c;大部分代码专用于处理该批注&#xf…

python opencv旋转_Python opencv实现与rotatedrect类似的矩形旋转,pythonopencv,RotatedRect

本文原理&#xff1a;先旋转矩形到指定角度&#xff0c;然后提取矩形外轮廓&#xff0c;从而获取旋转后的矩形坐标点。#&#xff01;/usr/bin/env python3# -*- coding: utf-8 -*-# Author: tcy# Date: 2020-5-2 21:00:53# Version:V1.01# Last Modified by: tcy shanghai song…

关于string转整数

又是leetcode的easy级别题&#xff0c;很基本的题目&#xff0c;却漏考虑很多情况&#xff0c;动手前一定要考虑清楚呀&#xff01;&#xff01;&#xff01; 就当做锻炼写作能力吧&#xff0c;先上题目&#xff01; 将文本转换成整数&#xff0c;注意一下几点&#xff1a; 1.文…

数字三角形——递归、递推、记忆化搜索

数字三角形 描述: 有一个由非负整数组成的三角形&#xff0c;第一行只有一个数&#xff0c;除了最下行之外每个数的左下方和右下方各有一个数。 问题&#xff1a; 从第一行的数开始&#xff0c;每次可以往左下或右下走一格&#xff0c;直到走到最下行…

Java 7功能概述

前面我们讨论了所有未纳入Java 7的内容&#xff0c;然后回顾了将其纳入Java 7的有用的Fork / Join框架 。 今天的帖子将带我们了解Project Coin的每个功能-一系列小的语言增强功能&#xff0c;这些功能虽然不是开创性的&#xff0c;但是对于任何能够使用JDK 7的开发人员来说都是…

缓存技术

提升系统性能的主要方式之一就是缓存。它可以挡掉大部分的数据库访问的冲击&#xff0c;如果没有它&#xff0c;系统很可能会因为数据库不可用导致整个系统崩溃。 但是缓存带来了另外一些棘手的问题&#xff1a; 数据的一致性和实时性。 例如&#xff0c;数据库中的数据状态已经…

水晶报表分组分栏_web报表可视化设计器工具推荐

古往今来&#xff0c;信息就是决胜的关键。在科技时代的今天亦是如此。企业的数据管理在帮助企业加强管控、提高竞争力等方面具有不可或缺的作用。这就不得不说到报表工具。企业想要将储存于各种商业信息系统中的数据转化成有用的信息&#xff0c;最终帮助决策者做出更快、更好…

嵌套矩形——DAG上的动态规划

有向无环图&#xff08;DAG,Directed Acyclic Graph&#xff09;上的动态规划是学习动态规划的基础。很多问题都可以转化为DAG上的最长路、最短路或路径计数问题。 题目描述&#xff1a; 有n个矩形&#xff0c;每个矩形可以用两个整数a,b描述&#xff0c;表示它的长和宽。矩形…

Twisted

Twisted定义Twisted是一个基于事件驱动的网络引擎框架网络框架&#xff0c;别人预先定义好的一个框架&#xff08;一个项目&#xff09;&#xff0c;如.net某个web框架有25个class&#xff0c;从BeginRequest依次执行类里的process方法&#xff0c;程序员自己定义一个类&#x…

从Spring到Java EE 6

我最近在一个非常复杂的项目中工作&#xff0c;其中融合了许多Java EE 6技术&#xff08;例如JPA&#xff0c;JAXB&#xff0c;JMS&#xff0c;JTA&#xff0c;JAX-RS等&#xff09;。 出于生产力和计划方面的原因&#xff0c;将原型应用程序设计为独立的纯Spring应用程序。 当…

Centos 6.5 搭建php环境(nginx+mariadb+php7)

1.mariaDb vim /etc/yum.repos.d/MariaDB.repo [mariadb] name MariaDB baseurl http://yum.mariadb.org/5.5/centos5-x86 gpgkeyhttps://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck1#如果服务器已经安装了MariaDB-Galera-server包&#xff0c;你可能需要在安装MariaDB-s…

MAC itunes无法验证服务器s.mzstatic/itunes无法更新服务器解决方案

打开host文件&#xff1a; 一、用终端打开&#xff1a; sudo vi /etc/hosts 输入完这行命令后需要输入电脑密码&#xff0c;然后确认&#xff0c;进入host文件 然后按i键进入编辑模式&#xff0c;在最后一行添加&#xff1a;23.214.233.166 s.mzstatic.com 如下图 添加完后&…

硬币问题——固定终点的最长路和最短路

问题描述&#xff1a; 有n种硬币&#xff0c;面值分别为V1,V2...,Vn,每种都有无限多。给定非负整数S&#xff0c;可以选用多少个硬币&#xff0c;使得面值之和恰好为S&#xff1f;输出硬币数目的最小值和最大值。0 < n < 100, 0 < S < 10000, 1 < Vi < S。 …

读取nas_NAS怎么玩?除了存放小姐姐,它竟然还有这些功能

自从有了电脑&#xff0c;就一直在折腾"存储那点事儿"&#xff0c;说到底&#xff0c;电脑的本质就是存储&#xff0c;而自己弄家用存储方面的东西算下来也有几年了。单机的硬盘存储比较简单&#xff0c;但是随着家里各种设备的增多&#xff0c;各个设备间的文件共享…

ZK Web框架思想

我曾多次被要求提出一些有关ZK的意见。 因此&#xff0c;根据我作为ZK用户4年的经验&#xff0c;以下是一些想法&#xff1a; 总体开发人员经验&#xff0c;社区和文档 “就是这样” ZK提供的大多数东西都能很好地工作&#xff0c;并且如果您以前开发过任何桌面Java应用程序&…

OC第一讲:类和对象

今天终于开始进行OC的学习了 一.首先讲了NSLog NSLog是oc里面的输出语句&#xff0c;其用法和printf差不多&#xff0c;但是还是有差别的 1&#xff0c;NSLog是自动换行的&#xff0c;不用像printf那样还需要加\n&#xff1b; 2&#xff0c;NSLog在引号面前需要添加符号&#x…