当前位置: 首页 > 知识库问答 >
问题:

spring+mybatis,如何在http请求中共享数据库连接

钱渊
2023-03-14

我创建了一个mvc控制器来处理用户的登录请求。

在控制器中,我需要完成一些与数据库相关的任务,每个任务将访问一个由spring自动连线的mybatis映射器的服务对象,这将创建一个mybatis sqlsession并使用它和关闭它。

我的问题是,我们能让所有这些任务共享同一个mybatis sqlsession吗?

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]

那么如何让多个映射器共享一个SqlSessionTemplate呢?

共有1个答案

公羊子真
2023-03-14

最简单的方法是使用SQLSessionFactoryBean

如果您有这样定义

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:myBatisConfig.xml" />
</bean>

然后可以逐个定义映射器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>

或者使用MapperScannerConfigureer通过扫描映射器类来实例化所有映射器

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.yourcompany.youapp.mapper" />
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
 类似资料:
  • 我有我的巴蒂斯 xml config 我有依赖关系 我有存储库 但是当我尝试构建priject时,我出错了。 描述: 无法确定数据库类型 NONE 的嵌入式数据库驱动程序类 行动: 如果你想要一个嵌入式数据库,请在类路径上放置一个受支持的数据库。如果要从特定配置文件加载数据库设置,则可能需要激活它(当前没有配置文件处于活动状态)。 我怎么设置SqlMapConfig.xml? 我尝试在行中写入 但

  • 在Spring MVC中,我可以使用ThreadLocal通过请求在不同组件之间共享数据,当请求完成时数据将被自动清除。使用WebFlux,由于一个请求可以由多个线程处理,因此该解决方案将不起作用。如何实现类似的解决方案,以便最初一个WebFilter可以在请求上下文中设置一些数据,然后可以在控制器中访问和修改数据,以及请求经过的任何事件处理程序? 我尝试了订阅者Context,但它不起作用。这是

  • 问题内容: 我是Go菜鸟,无法找到在Go中打开mysql连接然后在http处理程序之间共享它的完整示例。到目前为止,这是我的代码,如何使用在HomeHandler中的main()中打开的db连接? 问题答案: 数据库/ sql程序包会自动为您管理连接池。 返回 代表连接池 而不是单个连接的句柄。如果池中的所有连接都忙,则数据库/ sql软件包会自动打开一个新连接。 将其应用于代码意味着,您只需要共

  • 我试图在我的应用程序中配置2个不同的数据源,因为它是必需的。

  • 我不清楚如何通过上下文在Tomcat中建立与Oracle RAC数据库的连接。xml。这种方法对我很有效: 但这是使用连接池吗?我尝试添加,正如https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html建议的那样,神秘的是,随着这一变化,我开始得到: 如果我尝试类型=oracle.jdbc.pool.OracleDataSource和工厂=ora

  • 问题内容: 看来我应该这样做: 通过将其设置为来配置dispatcherServlet 但是,考虑到我没有XML配置,或者代码中没有任何各种初始化程序类(此答案提到),该怎么做? 在一个类中,我有一个像这样的方法,当前不会被调用。 Spring Boot 1.2.7.RELEASE; 一个简单的设置与Spring REST指南并没有太大区别 。 问题答案: 选项1:Spring Boot属性(仅适