在我的四部分系列的第二部分中,我将解释将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和一致性的高性能JPA –第2部分相关推荐

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

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

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

    glassfish 在我的四部分系列的第三部分中,我将说明将Coherence与EclipseLink和GlassFish结合使用的第二种策略. 这就是通过EclipseLink使用Coherence ...

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

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

  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. Docker部署Jmeter 性能监控服务(常用命令)
  2. swing中怎么在原来图片的基础上切换第二张图片_狂戳痛点!毕业论文图片和公式排版!...
  3. 大多数Web浏览器中都可以使用PUT,DELETE,HEAD等方法吗?
  4. 题目1030:毕业bg
  5. python的最大绘图速度_Python数据可视化之高速绘图神器PyQtGraph库,强烈建议收藏...
  6. vscode 代码莫名爆红(未定义标识符 “nullptr“)解决办法(VSCode 如何快速打开c_c++_properties.json文件)
  7. nginx 知识点 :ctx_index and index
  8. 卡尔曼滤波实例之系统逆辨识
  9. 拼不过 GO?阿里如何重塑云上的 Java
  10. 飞鸽传书2009的“真正价值”
  11. arcgis风向_[ArcGIS] 空间分析(六) 追踪分析(台风路径)
  12. [UE4]关于分支Sequence和条件分支的组合用法
  13. 【编程题目】对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一...
  14. 股票python量化交易015-计算累积收益率
  15. 【数据结构(C语言版)严蔚敏 第一章 绪论】
  16. 计算机作品二等奖——魔幻镜像
  17. Tensorflow(八) —— Tensor的合并与切割
  18. Jquery 模仿Baidu、Google收索时提示输入结果
  19. 退役赛总结(山东省第八届ACM程序设计大赛总结)
  20. c语言二目运算符. -

热门文章

  1. 不相交集ADT(联机算法 + 脱机算法)
  2. JDBC的SQL注入漏洞
  3. 常用jdk的命令行工具:_jhsdb:JDK 9的新工具
  4. Spring Bootstrap中具有配置元数据的高级配置
  5. Spring再次涵盖了您:继续进行消费者驱动的消息传递合同测试
  6. java 并发计数器_Java 8 LongAdders:管理并发计数器的正确方法
  7. singleton设计模式_Java Singleton设计模式
  8. 如何避免Java线程中的死锁?
  9. 什么是javax.ws.rs.core.context? [第3部分]
  10. hadoop3 禁用ec_Hadoop + Amazon EC2 –更新的教程