2016-10-07 21 views
1

我使用MyBatis 3.3.1,Spring 4.3,Jersey 2.22和Oracle 12c创建了一个休息服务。我的交易由Spring使用DataSourceTransactionManager和@Transaction注释来管理。我也使用MyBatis池数据源作为我的javax.sql.DataSource。我不明白为什么数据库会话正在被重用。MyBatis + Spring + Jersey与Oracle似乎重用SQL会话

在我的应用程序中,我设置了一个oracle客户机标识符:DBMS_SESSION.SET_IDENTIFIER(“my id”)。通过调试日志记录语句,我可以看到MyBatis为每个MyBatis sql操作创建新的会话。我也有调试从DBMS_SESSION.UNIQUE_SESSION_ID输出数据库会话标识符。

我不明白的是,如果我多次访问我的休息端点,唯一的会话ID是相同的,并且我上次访问的标识符仍然设置。

每次MyBatis获取新的SQLSession时,不应该使用新的Oracle会话吗?为什么oracle会话总是一样的?

谢谢。

回答

0

Oracle中的会话绑定到一个连接。 您正在使用连接池,因此一个休息请求完成后,连接将返回到连接池。在这种情况下会话没有终止。

您可能想清除返回到池的连接上的标识符,并在从池中检索连接时进行设置。确切的方法取决于您使用的连接池。对于内置的mybatis连接池,请参阅this answer

+0

嗨罗马,感谢您的意见。我试着做一些类似事务的事情,在事务开始时设置正确的会话变量,并在事务结束时删除。但是,基于调试,似乎MyBatis在@Transactional方法中多次调用创建会话。我可以看到正在创建的会话,然后添加到当前事务中。预计多个会话会构成一个交易吗?当事务提交时,它是否在所有会话中提交? – tux

+0

这取决于春天和mybatis的配置。通常会在交易期间创建一个会话。实现这个逻辑的核心方法是'org.mybatis.spring.SqlSessionUtils.getSqlSession'。 –

+0

我认为你的问题是你有两个数据源。一个在mybatis中配置,另一个在春季管理。 Spring不知道mybatis汇集的数据源。你如何配置SqlSessionFactory? –