我使用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会话总是一样的?
谢谢。
嗨罗马,感谢您的意见。我试着做一些类似事务的事情,在事务开始时设置正确的会话变量,并在事务结束时删除。但是,基于调试,似乎MyBatis在@Transactional方法中多次调用创建会话。我可以看到正在创建的会话,然后添加到当前事务中。预计多个会话会构成一个交易吗?当事务提交时,它是否在所有会话中提交? – tux
这取决于春天和mybatis的配置。通常会在交易期间创建一个会话。实现这个逻辑的核心方法是'org.mybatis.spring.SqlSessionUtils.getSqlSession'。 –
我认为你的问题是你有两个数据源。一个在mybatis中配置,另一个在春季管理。 Spring不知道mybatis汇集的数据源。你如何配置SqlSessionFactory? –