MyBatis+Spring+Jersey with Oracle 似乎重用了 SQL 会话

MyBatis+Spring+Jersey with Oracle Seems to reuses SQL sessions

我正在使用 MyBatis 3.3.1、Spring 4.3、Jersey 2.22 和 Oracle 12c 创建休息服务。我的交易由 Spring 使用 DataSourceTransactionManager 和 @Transaction 注释管理。我还使用 MyBatis 合并数据源作为我的 javax.sql.DataSource。我不明白为什么要重用数据库会话。

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

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

难道MyBatis每次获取一个新的SQLSession都要使用一个新的oracle session吗?为什么oracle会话总是一样的?

谢谢。

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

您可能希望在将连接返回到池时清除标识符,并在从池中检索连接时设置它。执行此操作的确切方法取决于您使用的连接池。 mybatis内置连接池见this answer.