0

我希望能够记录任何查询在我的数据库上花费的时间。我正在使用 MyBatis 来查询数据库。

目前,我有一个无状态 bean,上面有 select、update 等方法,并且我的 bean 的客户端(通过 @EJB 注释)调用这些方法。最重要的是,我在进行日志记录的无状态数据库交互 bean 上有一个类级别的拦截器。

通过对无状态数据库交互 bean 的任何调用,我打开一个会话,运行用户的查询,然后关闭会话,所有这些都在 try finally 块中。这很好,因为这样 EJB 客户端就不必担心关闭会话或记录查询花费了多长时间。

当 EJB 客户端想要对同一个数据库进行两次查询时,就会出现问题。我不能使用 XA 数据源,因为供应商不支持它。

我有一个解决方法,我实现了一个类似的无状态数据库交互 bean,它不会在每个选择、更新等方法中打开或关闭会话,而是通过使用 openSession() 和 closeSession() 方法。

我担心这仍然是一个无状态 bean,它可能会在客户端事务的中间被破坏,从而导致回滚。是这样吗?我应该让它成为一个有状态的bean吗?

我还编写了一个拦截器来实际为用户调用 openSession() 和 closeSession(),这样他们就可以注释他们的类或方法。

这似乎是一个很好的模式,还是有一个共同的模式来处理我失踪的这种情况?谢谢。

4

1 回答 1

0

如果您只查询一个数据库,则不需要 XA 事务。现在,一个事务可以跨越多个 EJB 方法调用。如果在方法上需要事务注解,并且在调用该方法时存在活动事务,则该方法将在现有事务的范围内执行。事务也关联了持久性上下文,因此如果您让容器在您需要的地方注入 EntityManager(使用 @PersistenceContext 注释),您的问题就解决了。在这种情况下,您不需要手动关闭 EntityManager。

于 2013-02-19T18:56:32.677 回答