Home Multi Tenancy with Mongodb and Gorm
Reply: 0

Multi Tenancy with Mongodb and Gorm

Zohaib
1#
Zohaib Published in 2016-10-24 17:02:57Z

I am trying to save objects in mongodb using multi tenancy at DATABASE level. However, objects always gets saved in the default database.

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

I can see that all the connections(default, 1 and 2) are loaded fine into connectionSourceMap in InMemoryConnectionSources.groovy class.

Interceptor function is invoked before controller function and interceptor sets the following property:

System.setProperty(SystemPropertyTenantResolver.PROPERTY_NAME, "1")

I was expecting that since Tenant id has been set to "1" and object against key "1" exists in connectionSourceMap, so now objects will be saved in test1db. However this is not the case when I try to save object

Tenants.withCurrent {
                   domainObj.save(flush: flush, validate: false)
               }

I tried to debug the application.

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 object appears to contain the right information with default database string set to test1db. However, the session object is again referring to test db as default db. I could not understand why this is happening and how could I resolve this.

I have a feeling that issue might be related to the following point in the documentation[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.

But could not figure out on how to resolve the issue.

Thanks for your help and time. Any help is appreciated.

1: http://gorm.grails.org/latest/hibernate/manual/index.html#multiTenancy

You need to login account before you can post.

About| Privacy statement| Terms of Service| Advertising| Contact us| Help| Sitemap|
Processed in 0.334021 second(s) , Gzip On .

© 2016 Powered by mzan.com design MATCHINFO