我计划为 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相同的上下文中,因此通过数据库会话共享内容是安全的,但我必须非常小心地在退出时取消设置所有内容,因为连接都集中在容器中。
您可以注入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#中如何检查线程是否处于活动状态的使用技巧和注意事项,需要的朋友参考一下 要检查线程是否存在,代码如下: 示例 输出结果 这将产生以下输出- 示例 现在让我们来看另一个示例- 输出结果 这将产生以下输出-