8.11. 集群环境中的 EJB 事务
如果客户端代码调用集群 EJB,则会自动设置集群关联性。如果您在客户端管理事务,您可以选择以集群中的特定节点为目标,或者 允许客户端精细选择集群节点来处理事务。本节描述了这两个选项。
EJB 事务针对特定节点
您可以针对集群中的特定节点来按照以下步骤处理事务。
在创建
InitialContext
时,使用PROVIDER_URL
属性指定目标集群节点地址。props.put(Context.PROVIDER_URL, "remote+http://127.0.0.1:8080"); ... InitialContext ctx = new InitialContext(props);
props.put(Context.PROVIDER_URL, "remote+http://127.0.0.1:8080"); ... InitialContext ctx = new InitialContext(props);
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在客户端中,从
InitialContext
查找 thetxn:RemoteUserTransaction
。UserTransaction ut = (UserTransaction)ctx.lookup("txn:RemoteUserTransaction");
UserTransaction ut = (UserTransaction)ctx.lookup("txn:RemoteUserTransaction");
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以通过将
PROVIDER_URL
属性设置为服务器的 URL,然后查找 uptxn:User
,如下代码示例所示:Transaction
,然后查找 ttxn:UserTransactionCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在实际调用发生之前,
UserTransaction
不会绑定到任何特定的目的地。在调用时,此UserTransaction
绑定到整个事务生命周期中的相应目标。在开始
UserTransaction
前,您不需要知道节点名称或目的地。org.jboss.ejb.client.EJBClient.getUserTransaction()
方法为您提供一个远程UserTransaction
,它可根据第一次调用自动选择其目的地。从 Java 命名和目录接口查找远程UserTransaction
的效果也相同。注意org.jboss.ejb.client.EJBClient.getUserTransaction()
方法已弃用。- 当事务开始时,在事务期间,所有 EJB 调用都会绑定到该特定节点,从而建立服务器关联性。
- 事务结束时,服务器关联性将被释放,EJB 代理返回到一般集群关联性。
EJB 事务 Lazily 选择节点
您可以允许客户端在与事务相关的第一次调用期间轻松选择集群节点来处理事务。这允许在群集间对事务进行负载平衡。要使用这个选项,请按照以下步骤操作。
-
不要在用于调用 EJB 的
InitialContext
中指定PROVIDER_URL
属性。 在客户端中,从
InitialContext
查找 thetxn:RemoteUserTransaction
。UserTransaction ut = (UserTransaction)ctx.lookup("txn:RemoteUserTransaction");
UserTransaction ut = (UserTransaction)ctx.lookup("txn:RemoteUserTransaction");
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 当事务开始时,将自动选择一个群集节点,建立服务器关联性,并在事务期间将所有 EJB 调用与该特定节点绑定。
- 事务结束时,服务器关联性将被释放,EJB 代理返回到一般集群关联性。