在我的网络应用程序中,我使用的是spring + spring-webmvc + mybatis,并使用了jndi数据源。
我创建了一个mvc控制器来处理用户的登录请求。
在控制器中,我需要完成一些与数据库相关的任务,每个任务都将访问一个服务对象,该服务对象通过spring自动连接mybatis映射器,这将创建一个mybatis sqlsession并使用它并关闭它。
我的问题是,我们可以让所有这些任务共享相同的mybatis sqlsession吗?
据我所知,mybatis sqlsession意味着涉及jdbc连接。
我不想浪费任何资源。
编辑
here is the logging message in the real example of my application:
19:26:29.959 [http-8080-3] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession
19:26:29.959 [http-8080-3] DEBUG org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@c1c7c4] was not registered for synchronization because synchronization is not active
19:26:30.001 [http-8080-3] DEBUG org.mybatis.spring.transaction.SpringManagedTransaction - JDBC Connection [jdbc:h2:tcp://127.0.0.1:6001/cmp, UserName=SA, H2 JDBC Driver] will not be managed by Spring
19:26:30.002 [http-8080-3] DEBUG org.codingfarm.cwe.sys.mappers.UrlRoleMapper.countByExample - ==> Preparing: select count(*) from CMP.PUBLIC.SYS_URL_ROLES WHERE ( URL = ? )
19:26:30.002 [http-8080-3] DEBUG org.codingfarm.cwe.sys.mappers.UrlRoleMapper.countByExample - ==> Parameters: index.jsp(String)
19:26:30.008 [http-8080-3] DEBUG org.codingfarm.cwe.sys.mappers.UrlRoleMapper.countByExample - <== Total: 1
19:26:30.008 [http-8080-3] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@c1c7c4]
19:26:30.008 [http-8080-3] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession
19:26:30.009 [http-8080-3] DEBUG org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@37c7ee] was not registered for synchronization because synchronization is not active
19:26:30.010 [http-8080-3] DEBUG org.mybatis.spring.transaction.SpringManagedTransaction - JDBC Connection [jdbc:h2:tcp://127.0.0.1:6001/cmp, UserName=SA, H2 JDBC Driver] will not be managed by Spring
19:26:30.010 [http-8080-3] DEBUG org.codingfarm.cwe.sys.mappers.UrlRoleMapper.countByExample - ==> Preparing: select count(*) from CMP.PUBLIC.SYS_URL_ROLES WHERE ( URL = ? and ROLE_ID in ( ? , ? ) )
19:26:30.011 [http-8080-3] DEBUG org.codingfarm.cwe.sys.mappers.UrlRoleMapper.countByExample - ==> Parameters: index.jsp(String), system(String), basic(String)
19:26:30.012 [http-8080-3] DEBUG org.codingfarm.cwe.sys.mappers.UrlRoleMapper.countByExample - <== Total: 1
19:26:30.012 [http-8080-3] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@37c7ee]
修改 根据mybatis-spring文档:
SqlSessionTemplate是MyBatis-Spring的核心。它实现了SqlSession,并且是代码中任何现有SqlSession使用的替代品。 SqlSessionTemplate是线程安全的,可以由多个DAO或映射器共享。
那么如何让几个映射器共享一个SqlSessionTemplate?
答案 0 :(得分:0)
最简单的方法是使用SqlSessionFactoryBean
。
如果您有这样的定义
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:myBatisConfig.xml" />
</bean>
然后,您可以逐个定义mapper bean
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.yourcompany.youapp.mapper.SomeMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
或者使用MapperScannerConfigurer
通过扫描mapper类来实例化所有这些
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.yourcompany.youapp.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
然后每个spring事务创建mybatis会话,并由所有实例化的映射器使用。