我正在尝试使用DATABASE
级别的多租户保存mongodb中的对象。但是,对象始终保存在默认数据库中。
my application.yml
development:
grails:
mongodb:
tenantResolverClass: org.grails.datastore.mapping.multitenancy.resolvers.SystemPropertyTenantResolver
url: mongodb://localhost/test
connections:
1:
url: mongodb://localhost/test1db
2:
url: mongodb://localhost/test2db
options:
maxWaitTime: 10000
我可以看到所有连接(默认值,1和2)都很好地加载到connectionSourceMap
类中的InMemoryConnectionSources.groovy
。
在控制器函数和拦截器设置以下属性之前调用拦截器函数:
System.setProperty(SystemPropertyTenantResolver.PROPERTY_NAME, "1")
我一直在期待,因为租户ID已被设置为" 1"并反对关键" 1"存在于connectionSourceMap
中,因此现在对象将保存在test1db中。但是,当我尝试保存对象
Tenants.withCurrent {
domainObj.save(flush: flush, validate: false)
}
我尝试调试应用程序。
MongoDataStore.java
@Override
public <T1> T1 withNewSession(Serializable tenantId, Closure<T1> callable) {
MongoDatastore mongoDatastore = getDatastoreForTenantId(tenantId);
Session session = mongoDatastore.connect();
try {
DatastoreUtils.bindNewSession(session);
return callable.call(session);
}
finally {
DatastoreUtils.unbindSession(session);
}
}
mongoDataStore
对象似乎包含正确的信息,默认数据库字符串设置为test1db。但是,会话对象再次将测试db称为默认db。我无法理解为什么会这样,我怎么能解决这个问题。
我觉得这个问题可能与文档[1]中的以下几点有关:
11.2.3. Multi Tenancy and the Session Factory
Note that if you reference the default SessionFactory or PlatformTransactionManager in your classes that are injected via Spring, these will not be tenant aware and will point directly to default data source.
但无法弄清楚如何解决这个问题。
感谢您的帮助和时间。任何帮助表示赞赏。
1:http://gorm.grails.org/latest/hibernate/manual/index.html#multiTenancy