在我的web应用程序中,我使用的是spring + spring-webmvc + mybatis,并且使用了jndi数据源。spring + mybatis,如何在http请求中共享数据库连接
我创建了一个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 [[email protected]] 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 [[email protected]]
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 [[email protected]] 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 [[email protected]]
编辑: 根据的MyBatis-Spring文档:
SqlSessionTemplate是MyBatis的弹簧的心脏。它实现了SqlSession,并且是代替任何现有的SqlSession使用的替代品。 SqlSessionTemplate是线程安全的,可以被多个DAO或映射器共享。
那么如何让几个mappers共享一个SqlSessionTemplate?
如果您将SqlSessionTemplate定义为singleton(这是默认值)bean,那么您的所有映射器应自动共享该一个实例。刚刚尝试通过注入各种映射器和是的,他们都有一个参考相同的SqlSessionTemplate。你是否可能将SqlSessionTemplate定义为Prototype? –