我正在为实体使用具有二级缓存的spring boot,例如
@Entity
@Table(name = "customer")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Customer implements Serializable {
....
}
这是按预期工作的,但现在我必须将应用程序转换为多租户版本。每个租户都有自己的数据库,我们使用ThreadLocal
存储当前租户,AbstractRoutingDataSource
用于路由到租户的数据库。如果第二级缓存已关闭,则此工作正常。
让二级缓存工作也很好。问题似乎是缓存名称,即实体的FQCN。由于缓存不是租户或数据库感知的,因此每个租户使用相同的缓存。
为此,我们使用ThreadLocal
解析当前租户只需
TenantContext.getCurrentTenant();
并返回租户名称。
我们使用EhCache,它由spring cache abstraction支持:
@Bean
public CacheManager cacheManager() {
net.sf.ehcache.CacheManager cacheManager = net.sf.ehcache.CacheManager.create();
EhCacheCacheManager ehCacheManager = new EhCacheCacheManager();
ehCacheManager.setCacheManager(cacheManager);
return ehCacheManager;
}
是否可以拦截缓存名称的生成,以便使用当前租户名称而不是FQCN,并且每个insert / lookup / evict都会解析此租户感知缓存名称?