【问题标题】:MyBatis-Spring multi-datasource configuration cache issuesMyBatis-Spring 多数据源配置缓存问题
【发布时间】:2014-07-25 08:16:18
【问题描述】:

使用 mybatis-3.1.0、spring-3.1.1.RELEASE 和 mybatis-spring-1.1.0,我们在多数据源配置中面临一些令人讨厌的缓存问题。

出于安全原因,我们有不同的数据源指向相同的数据库和架构,每个数据源使用不同的凭据。目标是使用一个只有选择权限的 db 用户进行选择,另一个具有插入/更新/删除权限的用户进行 dml 操作,等等。

为此,我们配置了三个单独的 SqlSessionFactoryBean,每个数据源一个。问题就来了:当使用“DML”会话执行插入操作时,“SELECT”会话的本地缓存不会被刷新。因此,例如,我们在用户列表中看不到新创建的用户。

所以我的问题是:我们有什么方法可以同时配置与所有三个数据源关联的单个 SqlSessionFactoryBean?

更新:

经过更多调试,看起来核心问题实际上与事务管理有关。站点中的某些操作涉及多个操作,这些操作是通过不同的数据源执行的。看起来我们没有正确配置事务管理器,并且其中一个或多个操作被排除在提交之外。多次尝试后,由于连接耗尽,数据库操作变得一团糟。

那么,现在的问题是,如何配置单个事务管理器来处理所有涉及的数据源?

【问题讨论】:

  • 您是否尝试过在您的选择语句中设置flushCache=true?
  • 将 flushCache 设置为 true 将无济于事,因为在执行 select 之后不会清除缓存。

标签: spring caching transactions mybatis


【解决方案1】:

只有一个数据源可以与给定的 sqlSessionFactory 关联。但这不是主要问题。主要问题是本地缓存是associated 与mybatis session。因此,当您使用说两个不同的会话时,您将有两个不同的本地缓存 - 每个会话一个,而拥有一个 sqlSessionFactory 将无济于事。

您可能应该考虑的选项是为您的只读会话设置 localCacheScope=STATEMENT。在这种情况下,它不会在查询执行后缓存结果。为了能够仍然使用缓存,使用自定义适配器为某些全局配置的缓存或使用全局缓存的 existing cache adapter 配置二级缓存,例如缓存。

【讨论】:

  • 你是对的。拥有一个会话工厂是不够的。事实证明,这与在同一请求中混合事务性和非事务性操作有关。使用单个数据源的测试运行良好,我们最终设法重新定义了权限集,因此每个操作都需要一个会话和事务管理器。
猜你喜欢
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 2019-11-09
相关资源
最近更新 更多