TransactionManagementType.CONTAINER 对比 TransactionManagementType.BEAN

TransactionManagementType.CONTAINER vs TransactionManagementType.BEAN

TransactionManagementType.CONTAINER和TransactionManagementType.BEAN有什么区别

因为我在我的所有 EJB 中都使用 TransactionManagementType.CONTAINER 并且每当使用数据库的多个实例时,它会抛出一个错误,如果我将其更改为 TransactionManagementType.BEAN

我想知道改成TransactionManagementType.BEAN

有什么优缺点以及效果如何
ERROR:
Error updating database.  Cause: java.sql.SQLException: javax.resource.ResourceException: 
IJ000457: Unchecked throwable in managedConnectionReconnected() cl=org.jboss.jca.core.
connectionmanager.listener.TxConnectionListener@680f2be0[state=NORMAL managed 
connection=org.jboss.jca.adapters.jdbc.local.LocalManagedConnection@7ba33a94 connection 
handles=0 lastReturned=1495691675021 lastValidated=1495690817487 
lastCheckedOut=1495691675018 trackByTx=false pool=org.jboss.jca.core.connectionmanager.
pool.strategy.OnePool@efd42c4 mcp=SemaphoreConcurrentLinkedQueueManagedConnectionPool
@71656eec[pool=FAQuery] xaResource=LocalXAResourceImpl@4c786e85
[connectionListener=680f2be0 connectionManager=5c3b98bc warned=false 
currentXid=null productName=Oracle productVersion=Oracle Database 12c 
Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
jndiName=java:/FAQuery] txSync=null]

关于你的具体问题,没有看到任何bean代码或错误消息,这可能是正在发生的事情:如果你有更多的数据库那么每个数据库和它对应的驱动程序必须能够加入一个现有的事务,否则你会得到具体的详细错误。

如果您使用 TransactionManagementType.BEAN,则需要该 bean 来启动一个全新的事务。这意味着您没有加入现有事务,并且每个数据库操作都相互独立地开始和提交。

您可以通过保留 TransactionManagementType.CONTAINER 并使用 REQUIRES_NEW 注释您的方法来实现相同的效果,当然前提是您通过相应的 proxy/interface.[=13= 调用每个 EJB ]

所以把它说成 BEAN vs CONTAINER 是不正确的,而是你必须做出一些设计选择并相应地注释你的方法。

根据以下标记之一的方法请求:

  • REQUIRES_NEW 现有事务被暂停,该方法在全新事务下运行
  • REQUIRED 是默认行为,如果事务存在,方法将重用它,否则创建并在其中运行方法

TransactionManagementType.CONTAINER

你让容器自己管理事务(容器会提交和回滚)。您可以通过使用 @TransactionManagementAttribute 注释方法并指定 TransactionAttribute Types.

中的属性之一来控制事务的行为(更准确地说是事务传播)

TransactionManagementType.BEAN

您必须自己通过获取 UserTransaction 接口明确地进行事务划分(启动、提交、回滚)。

@Resource
UserTransaction ut;

public void method(){
   ut.begin();
... // your business logic here
   ut.commit(); // or ut.rollback();
}

请注意,在退出声明无状态和消息驱动 Bean 事务的相同方法之前,您必须提交和回滚,但有状态 bean 不需要。

关于你的问题,BMT的优点是事务范围可以小于方法本身的范围,即事务的显式控制。 您很可能会使用 CMT,只有在某些狭窄的角落情况下才需要 BMT 来支持特定的业务逻辑。 BMT 的另一个优势或用例是,如果您需要使用扩展持久性上下文类型,它可以在 BMT 中使用有状态会话 Bean 得到支持。