我希望能够记录任何查询在我的数据库上花费的时间。我正在使用 MyBatis 来查询数据库。
目前,我有一个无状态 bean,上面有 select、update 等方法,并且我的 bean 的客户端(通过 @EJB 注释)调用这些方法。最重要的是,我在进行日志记录的无状态数据库交互 bean 上有一个类级别的拦截器。
通过对无状态数据库交互 bean 的任何调用,我打开一个会话,运行用户的查询,然后关闭会话,所有这些都在 try finally 块中。这很好,因为这样 EJB 客户端就不必担心关闭会话或记录查询花费了多长时间。
当 EJB 客户端想要对同一个数据库进行两次查询时,就会出现问题。我不能使用 XA 数据源,因为供应商不支持它。
我有一个解决方法,我实现了一个类似的无状态数据库交互 bean,它不会在每个选择、更新等方法中打开或关闭会话,而是通过使用 openSession() 和 closeSession() 方法。
我担心这仍然是一个无状态 bean,它可能会在客户端事务的中间被破坏,从而导致回滚。是这样吗?我应该让它成为一个有状态的bean吗?
我还编写了一个拦截器来实际为用户调用 openSession() 和 closeSession(),这样他们就可以注释他们的类或方法。
这似乎是一个很好的模式,还是有一个共同的模式来处理我失踪的这种情况?谢谢。