gpt4 book ai didi

java - 在 Java-EE 中透明地管理每个请求事务

转载 作者:行者123 更新时间:2023-12-01 13:34:23 26 4
gpt4 key购买 nike

我正在开发一个 JEE 应用程序,其中对“facade”bean 执行的每个请求都应该运行一个事务。

基本上,在每种方法中,我都可以这样做:

@Override
public void updateSalaries(float factor)
{
initializeTransaction();
// Actual business code...
commitTransaction();
}

其中 ùpdateSalaries() 是客户端调用的方法,其中 initializeTransaction()commitTransaction()` 分别负责获取/启动/提交/滚动返回(如有必要)交易。

不幸的是,事务管理应该更加透明:开发人员在编写业务方法时不应该关心这一点。

因此,某种方式来“装饰”这些业务方法会很好,但我想不出可能的方法来做到这一点。

我想到的另一个可能的解决方案是在中央 DataAccessBean 类中处理它,我将在 @PostConstruct 上启动事务并在 上提交它@PreDestroy:

@Stateless
public class DataAccessBean implements IDataAccessBean
{
@PostConstruct
public void initializeTransaction() { /* ... */ }

@PreDestroy
public void endTransaction() { /* ... */ }

@Override
public <T implements Serializable> T getObjectById(
Class<T> objectType, Object key) { /* ... */ }

@Override
public void saveObject(Serializable object) { /* ... */ }
}

但我不确定我是否可以依赖该机制。一个重要的问题是,我需要什么类型的 bean:我怀疑有状态 bean 是否合适,因为事务是按请求而不是按 session 进行的。也许无状态 bean 是一个不错的选择,但据我所知,当请求完成时,无状态 bean 可能不会被销毁(如果它驻留在无状态 bean 池中)。

两个小限制:

  • 解决方案不应依赖于特定的非标准框架或 JEE 服务器
  • 该解决方案应与 JEE 6 和 JEE 7 兼容

感谢您的建议。

最佳答案

Java Transaction API (JTA) 可以满足您的需求。来自 JEE6 教程(第八部分 - 第 42 章):

The Java Transaction API (JTA) allows applications to access transactions in amanner that is independent of speciic implementations. JTA speciies standard Java interfaces between a transactionmanager and the parties involved in a distributed transaction system: the transactional application, the Java EE server, and themanager that controls access to the shared resources afected by the transactions.

您想要使用容器管理的事务。在此策略中,您只需要使用适当的事务属性来装饰 bean/方法,即:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public void myMethod() {
...
}

服务层的设计必须仔细解决事务生命周期,以防您有服务的服务(嵌套服务调用)。

关于java - 在 Java-EE 中透明地管理每个请求事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21386131/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com