具有 spring 安全核心的 Grails 3.1.8 使用多个数据源

Grails 3.1.8 with spring security core using multiple datasources

我遇到了 grails spring-security-core plugin/spring-ldap 插件的问题。这是我的第一个 post link, and full stacktrace。问题是:

我有一个包含多个数据源的应用程序和

添加的 spring-security-core 插件
`build.gradle ` `compile "org.grails.plugins:spring-security-core:3.1.1"`

运行 这个应用程序在 tomcat 服务器中构建,它运行良好,但是当我尝试在我自己的 tomcat 中部署 war 文件时,它失败了错误(在 link 中),我一直试图找出导致它的原因,第一个解决方案是关闭二级缓存,第二个解决方案是从项目中删除 spring-security-core 插件。我不知道这是一个错误还是我缺少一些配置,也许默认配置还不够?。项目在以前的 grails 版本 3 中工作。0.x。如果您想重现错误,只需创建新的 grails 项目 - 使用 Web 配置文件,添加多个数据源(oracle、mssql)并尝试将其部署到 tomcat.

我认为这可能是插件依赖性的问题,因为它也使用了 ehcache,而且我对 hibernate-ehcache 有依赖性,但排除 ehcache-core 没有帮助。这是失败的示例项目的回购 link

不确定您是否注意到了,但是您的堆栈跟踪清楚地表明您创建了一个重复的 CacheManager。您可能需要检查您的 ehcache.xml 或 ehcache-failsafe.xml

Caused by: org.hibernate.cache.CacheException: net.sf.ehcache.CacheException: Another unnamed CacheManager already exists in the
ame VM. Please provide unique names for each CacheManager in the config or do one of following:
1. Use one of the CacheManager.create() static factory methods to reuse same CacheManager with same name or create one if necessa
y
2. Shutdown the earlier cacheManager before creating new one with same name.
The source of the existing CacheManager is: DefaultConfigurationSource [ ehcache.xml or ehcache-failsafe.xml ]
        at org.hibernate.cache.ehcache.EhCacheRegionFactory.start(EhCacheRegionFactory.java:107)
        at org.hibernate.internal.CacheImpl.<init>(CacheImpl.java:70)
        at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:40)
        at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:35)
        at org.hibernate.service.internal.SessionFactoryServiceRegistryImpl.initiateService(SessionFactoryServiceRegistryImpl.jav
:91)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:251)
        ... 74 common frames omitted
Caused by: net.sf.ehcache.CacheException: Another unnamed CacheManager already exists in the same VM. Please provide unique names
for each CacheManager in the config or do one of following:
1. Use one of the CacheManager.create() static factory methods to reuse same CacheManager with same name or create one if necessa
y
2. Shutdown the earlier cacheManager before creating new one with same name.
The source of the existing CacheManager is: DefaultConfigurationSource [ ehcache.xml or ehcache-failsafe.xml ]

UPDATE:您可能要考虑这个similar question的配置。基本上他们使用的是共享单例 bean,因此可以避免重新创建缓存:

DataSource.Groovy:

cache.region.factory_class = 'org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory'

Config.groovy:

    cacheManager {
        shared = true
    }

我不确定这是否确实是您的情况(我们没有看到您的配置),但这是一个开始。