gpt4 book ai didi

java - TransactionRolledbackLocalException 客户端的事务在访问@Singleton 时中止

转载 作者:搜寻专家 更新时间:2023-11-01 01:45:14 24 4
gpt4 key购买 nike

注意:在花费了比我愿意承认的更多时间来寻找原因之后,以简短的形式添加这个问题并给出答案。希望我能减轻其他人的痛苦。

当将方法调用委托(delegate)给使用 @Singleton 注释的 EJB 时,容器会抛出如下异常:

TransactionRolledbackLocalException Client's transaction aborted 

Singleton bean 没有发生数据访问。

ServiceBeanImpl.java

@Stateless
@Local
public class ServiceBean extends BaseBean{
@EJB private CacheService cacheService;

public FooObj getFooFromCache(int id) {
FooObj fooObj = (FooObj) cacheService.get(id);
if (fooObj == null) {
fooObj = getEntityById(FooObj.class, id);
cacheService.put(id, fooObj); //This throws exception
}
return cacheService.get(id);
}
}

CacheServiceImpl.java

@Singleton
@Startup
public class CacheServiceImpl implements CacheService {
private Cache cache;

@PostConstruct
public void init() {
CacheManager instance = CacheManager.getInstance();
cache = instance.getCache("cache");
}

@PreDestroy
public void destroy() {
CacheManager.getInstance().shutdown();
}

public Object get(Object id) {
return cache.get(id);
}

public void put(Object id, Object obj) {
return cache.put(id, obj);
}
}

问题为什么调用不进行数据访问的 Singleton bean 会抛出事务异常?

最佳答案

简答:检查先前执行的代码堆栈(假设 StackTrace 中没有线索)是否存在被捕获但未传播的异常(因此 StackTrace 中没有线索)。

在这种特殊情况下,有一个关于创建命名查询的try/catch。如果该命名查询失败,则在 catch block 中执行辅助查询。查询不需要事务,因此回退查询正确执行并返回了预期的实体。

然而...

这也(我认为)将事务标记为需要回滚。 @Singleton bean 有点像转移注意力。将控制权转移到该 bean 的某些事情使容器检查事务,这又会在此时抛出异常,但该异常是适当的,因为事务不再有效。

故事的寓意:

  • 回溯到上次数据库交互,因为那可能是您的问题所在。
  • 仅仅因为最后一次数据库交互返回了数据并不意味着它没有问题(这对我来说是致命的)。

关于java - TransactionRolledbackLocalException 客户端的事务在访问@Singleton 时中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12948103/

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