使用Oracle的MyBatis + Spring + Jersey似乎重用SQL会话

时间:2016-10-07 18:31:46

标签: spring mybatis oracle12c spring-mybatis

我正在使用MyBatis 3.3.1,Spring 4.3,Jersey 2.22和Oracle 12c创建休息服务。我的事务由Spring使用DataSourceTransactionManager和@Transaction annotaion进行管理。我也使用MyBatis池数据源作为我的javax.sql.DataSource。我不明白为什么数据库会话被重用的原因。

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

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

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

感谢。

1 个答案:

答案 0 :(得分:0)

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

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