【问题标题】:MyBatis+Spring+Jersey with Oracle Seems to reuses SQL sessionsMyBatis+Spring+Jersey with Oracle 似乎重用了 SQL 会话
【发布时间】:2016-10-10 21:45:28
【问题描述】:

我正在使用 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 会话吗?为什么预言机会话总是一样的?

谢谢。

【问题讨论】:

    标签: spring mybatis oracle12c spring-mybatis


    【解决方案1】:

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

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

    【讨论】:

    • 嗨罗曼,感谢您的评论。我尝试对事务做类似的事情,在事务开始时设置正确的会话变量,在事务结束时删除。但是,根据调试,似乎 MyBatis 调用在 @Transactional 方法中多次创建会话。我可以看到正在创建的会话,然后将其添加到当前事务中。是否期望多个会话组成一个事务?当事务提交时,它是否在所有会话上都提交?
    • 取决于spring和mybatis的配置。通常在事务期间创建一个会话。实现这个逻辑的中心方法是org.mybatis.spring.SqlSessionUtils.getSqlSession
    • 我认为你的问题是你有两个数据源。一个在mybatis中配置,另一个由spring管理。 Spring不知道mybatis pooled datasource。你SqlSessionFactory是怎么配置的?
    猜你喜欢
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多