使用mybatis-3.1.0,spring-3.1.1.RELEASE和mybatis-spring-1.1.0,我们在多数据源配置中遇到了一些讨厌的缓存问题。
出于安全原因,我们有单独的数据源指向相同的数据库和模式,每个数据源使用不同的凭据。目标是使用仅具有选择权限的数据库用户进行选择,使用具有插入/更新/删除权限的其他用户执行dml操作,等等。
为此,我们配置了三个独立的SqlSessionFactoryBeans,每个数据源一个。问题出现在这里:当使用“DML”会话执行插入操作时,“SELECT”会话的本地缓存不会被刷新。因此,例如,我们在用户列表中看不到新创建的用户。
所以我的问题是:我们是否有办法同时配置与所有三个数据源关联的单个SqlSessionFactoryBean?
更新
经过一些调试后,看起来核心问题实际上与事务管理有关。站点中的某些操作涉及多个操作,并且这些操作通过不同的数据源执行。看起来我们没有正确配置事务管理器,并且这些操作中的一个或多个被排除在提交之外。经过多次尝试,当连接耗尽时,数据库操作就完全搞砸了。
那么,现在的问题是,如何配置单个事务管理器来处理所有涉及的数据源?
答案 0 :(得分:0)
只有一个数据源可以与给定的sqlSessionFactory相关联。但这不是主要问题。主要问题是本地缓存是associated与mybatis会话。因此,当您使用两个不同的会话时,您将拥有两个不同的本地缓存 - 每个会话一个,并且有一个sqlSessionFactory将无济于事。
您应该考虑的选项是为只读会话设置localCacheScope = STATEMENT。在这种情况下,它不会在执行查询后缓存结果。为了能够仍然使用缓存,使用自定义适配器为某些全局配置的缓存配置二级缓存,或使用全局缓存的existing cache adapter,例如的Ehcache。