模式通过在bean上使用拦截器记录与数据库的所有交互

时间:2013-02-19 18:22:20

标签: ejb-3.1 mybatis

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

目前,我有一个无状态bean,它有像select,update等一样的方法,我的bean的客户端(通过@EJB annotation)调用这些方法。除此之外,我在无状态数据库交互bean上有一个类级别拦截器来执行我的日志记录。

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

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

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

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

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

这看起来是一个好的模式,还是有一种常见的模式来处理这个我错过的案例? 感谢。

1 个答案:

答案 0 :(得分:0)

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