当前位置: 首页 > 知识库问答 >
问题:

如何判断Java EE 6拦截器中的事务是否处于活动状态?

宋明亮
2023-03-14

我计划为 EJB 编写一个拦截器,它基本上可以执行以下操作:

@AroundInvoke
public Object setContext(InvocationContext ctx) throws Exception {
    em.createQuery("... set something [database specific] ...").getSingleResult();
    try {
        return ctx.proceed();
    } finally {
        em.flush();
        em.createQuery("... unset something [database specific] ...").getSingleResult();
    }
}

问题是,如果em.flush()应用于用@TransactionAttribute(NOT _ SUPPORTED)或@TransactionAttribute(SUPPORTS)注释的方法(即只读方法),它会引发异常,而它在使用默认@ transaction attribute(必需)的方法(即更改数据库的方法)时工作良好。

有没有办法判断一个事务是否是活动的,以避免在当前没有事务运行时调用em.flush(),或者我必须创建两个拦截器,一个使用em.flush(),一个不使用它?

我无法注入UserTransaction,因为bean使用容器管理的事务。EntityManager(em)事务方法仅适用于resource_local事务,而不适用于JTA事务。我需要调用em.flush()来确保未设置的查询是最后一个运行的查询。

作为一个额外的问题,有人知道我想做的是不是某种不良行为吗?我知道拦截器运行在与bean相同的上下文中,因此通过数据库会话共享内容是安全的,但我必须非常小心地在退出时取消设置所有内容,因为连接都集中在容器中。

共有1个答案

佟阳飙
2023-03-14

您可以注入TransactionSynchronizationRegistry并使用getTransactionStatus获取当前上下文中事务的状态,它会返回一个int,它是status类中的一个常量,在您的案例中,您正在查找status_NO_transaction

注入:

@Resource
TransactionSynchronizationRegistry tsr;

查看交易状态:

if (Status.STATUS_NO_TRANSACTION == tsr.getTransactionStatus()) {
   // no transaction
}
 类似资料:
  • 问题内容: 对于每个请求,您可以通过几种不同的方式来判断会话是否已经开始,例如: 要么: 但是,如果您启动会话然后将其关闭,它们都将失败。将返回前一个会话的ID,同时将对其进行定义。同样,如果您已经有一个活动会话,则此时调用将生成一个。有没有一种明智的方法来检查会话当前是否处于活动状态,而不必诉诸输出缓冲,关闭运算符()或其他类似hacky的方法? 编辑8/29/2011:向PHP 5.4添加了新

  • 问题内容: 我有一个每秒调用一次的函数,仅当当前页面位于前台时才运行,即用户没有最小化浏览器或切换到另一个选项卡。如果用户不看它,它是没有用的,并且可能占用大量CPU,因此我不想只在后台浪费时间。 有人知道如何用JavaScript讲这个吗? 注意:我使用jQuery,因此,如果您的答案使用了jQuery,那就好了:)。 问题答案: 您将使用窗口的和事件: 要回答“ Double Fire”的评论

  • 令我惊讶的是,已经完成执行但尚未加入的C11std::thread对象仍然被视为活动执行线程。下面的代码示例说明了这一点(基于Xubuntu 13.03和G4.7.3构建)。有人知道C 11标准是否提供了一种检测std::thread对象是否仍在积极运行代码的方法吗?

  • 我需要检查FTP服务器是否处于活动状态,此服务器是否: 我尝试了这段代码: 问题是返回以下异常: 如何才能做到这一点呢? 谢谢你

  • 问题涉及的方法是: 编辑。以下是完整的堆栈跟踪(一些消息是西班牙语的):

  • 本文向大家介绍C#中如何检查线程是否处于活动状态,包括了C#中如何检查线程是否处于活动状态的使用技巧和注意事项,需要的朋友参考一下 要检查线程是否存在,代码如下: 示例 输出结果 这将产生以下输出- 示例 现在让我们来看另一个示例- 输出结果 这将产生以下输出-