gpt4 book ai didi

java - 将异常记录到数据库中

转载 作者:行者123 更新时间:2023-12-01 11:00:29 25 4
gpt4 key购买 nike

我从无状态 ejb 获得了一个方法调用,如下所示

@Stateless
@Local(MyCrudService.class)
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public class MyCrudServiceBean implements MyCrudService {

@EJB
private CrudService crudService;

@Override
public void writeLogEntry(StatementLog statementLog) {
try {
crudService.execute(statement.getSql());
} catch (Exception e) {
crudService.writeLogEntry(statementLog);
throw new MyApplicationException(e.getLocalizedMessage());
}
}

// ...

}

CrudSerivce:

@Stateless
@Local(CrudService.class)
@TransactionAttribute(TransactionAttributeType.MANDATORY)
@Interceptors(GenericFrepDataBaseUserInterceptor.class)
public class CrudServiceBean implements CrudService {

public static final String PERSISTENCE_UNIT_NAME = "name";

private EntityManager entityManager;

@PersistenceContext(unitName = PERSISTENCE_UNIT_NAME)
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}

@Override
public void execute(String sqlString) {
Query query = entityManager.createNativeQuery(sqlString);
query.executeUpdate();
}

@Override
public void writeLogEntry(StatementLog statementLog) {
entityManager.persist(entity);
}

// ....
}

语句是一个实体,它获得了无效的 sql(如“无效的 sql”)。执行时出现以下错误

javax.ejb.EJBTransactionRolledbackException:JBAS011469

如果我调试它,我可以看到这发生在日志记录行中。

我认为问题是,因为我收到异常,所以事务被回滚。因此,无法写入数据库,因为不再有打开的 session 。是这样吗?那么最佳实践是什么?自己手动打开 session 对我来说似乎很难看。

最佳答案

你的方法log.writeErrorInDb需要启动自己的事务,这样当主事务回滚时它仍然可以运行。是的,如果您的 Hibernate session 已经关闭,那么您的日志类将需要能够打开自己的 session 。然而,最好有一个事务边界覆盖整个代码块,并将 Hibernate session 绑定(bind)到该边界,然后将日志方法设置为需要新事务,以确保在第一个事务被标记为回滚后它可以运行。即两笔交易,但一个 session

根据您的代码,您应该能够注释您的日志方法:

@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void writeLogEntry(StatementLog statementLog) {
entityManager.persist(entity);
}

关于java - 将异常记录到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33369211/

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