首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EJB事务与Oracle事务

EJB事务与Oracle事务
EN

Stack Overflow用户
提问于 2011-07-13 02:41:49
回答 3查看 1.6K关注 0票数 4

我在这里有一个奇迹。我有一个带有EJB的web应用程序来与数据库通信。我打算在两个不同的应用服务器上运行它(完全不同的服务器在不同的硬件上运行)。我打算让他们共享一个单一的数据库。

它是如何处理事务的?我有两个独立的服务器,所以有两个独立的EJB事务存储库,而只有一个数据库,所以有一个数据库事务的“存储库”,这是否有风险?

这个安全吗?

我确实知道这个架构是无效的,而且还有更好的方法,但是关于EJB和Oracle事务,我站在哪里?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-13 04:31:47

我的意思是,当您从一个EJB上下文与多个事务资源(例如,两个不同的数据库或服务器等)进行交互时,JTA发生了相反的情况。这不是你的案子。当EJB事务启动时,JTA负责在这些资源中的每个资源中启动一个事务,并在所有这些资源中提交(如果其中一个失败,则回滚所有这些资源)以及EJB事务。

在您的例子中,您可以使用JTA,也可以不使用JTA,因为您只有一个事务性资源。

在回答您的问题时,您可以安全地从不同的EJB应用程序访问同一数据库,而不会有风险,因为数据的完整性将由数据库的事务引擎来保证。

当您从一个EJB上下文与一个EntityManager (反过来与一个数据库通信)通信时,数据库事务将自动启动,它与数据库中启动的其他事务隔离(例如,与其他EJB上下文(您的情况)或其他任何应用程序隔离)。

我希望它能帮上忙。

票数 4
EN

Stack Overflow用户

发布于 2011-07-13 03:38:00

您不需要说明是否在一台服务器上有EJB对另一台服务器上的其他EJB进行远程调用。

如果我们假设您只是要将应用程序部署到具有两个节点的集群App Server上,那么XA (两阶段提交)就无关紧要了,因为您可以让您的应用程序使用本地EJB,这意味着EJB之间的所有通信都保留在一个节点上。

您需要在两个节点的前面粘贴一个负载均衡器,它可以在两个节点之间分担负载。

这样做将意味着来自客户端浏览器的任何单个请求都完全在一个节点内处理,这将提供良好的性能,因为您在EJB之间没有远程调用。因此,来自web层的单个请求将在事务进入EJB容器时启动该事务(如果需要),并且该事务将在EJB调用返回时提交(除非EJB容器确定由于异常或对上下文的显式调用而需要回滚该事务)。

像这样一个简单的架构是很正常的,你会发现世界各地有成千上万的应用程序都是这样构建的。

随着您的webapp负载随着更多用户的增加而增加,您可以通过添加越来越多的节点来向外扩展-应用服务器管理器将确保将应用部署到新节点。

这种架构的唯一问题是,当一个节点“消失”时会发生什么,比如说由于崩溃或者是因为硬件维护而被关闭。在这种情况下,用户的web会话将丢失,除非您已告知应用服务器跨节点共享会话。如果这样做,整体性能会受到影响,因为节点之间会持续共享会话状态。或者,如果此功能未激活,则会出现后续web请求需要由负载均衡器路由到同一节点的问题。

您将最了解您的需求,并且必须准确地选择您选择的架构。

票数 2
EN

Stack Overflow用户

发布于 2011-07-13 02:48:51

它的工作方式是通过JTA。

JTA支持分布式事务及其管理。要使数据库能够参与分布式事务,您必须使用XA (事务感知)资源。

这里有一篇关于EJB3和事务的文章。它有点过时了,但它解决了细节问题

http://java.sys-con.com/node/325149

就像其他任何东西一样,使用JTA和XA也有风险和好处。您可以保证数据完整性,如果您的应用程序在很大程度上依赖于事务性,那么这可能是一种值得采用的方法。这样做的缺点是XA的性能较差,而且总是存在这样的风险,即某些dosnwstream应用程序可能会在很长时间内持有数据库锁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6669336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档