Home Multi Tenancy with Mongodb and Gorm
Reply: 0

Multi Tenancy with Mongodb and Gorm

user43947
1#
user43947 Published in September 21, 2018, 2:50 am

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

share|improve this question
  • Could you provide an example that reproduces the issue on github? – Graeme Rocher Oct 27 '16 at 11:06

active oldest votes

Your Answer

StackExchange.ifUsing("editor", function () { StackExchange.using("externalEditor", function () { StackExchange.using("snippets", function () { StackExchange.snippets.init(); }); }); }, "code-snippets"); StackExchange.ready(function() { var channelOptions = { tags: "".split(" "), id: "1" }; initTagRenderer("".split(" "), "".split(" "), channelOptions); StackExchange.using("externalEditor", function() { // Have to fire editor after snippets, if snippets enabled if (StackExchange.settings.snippets.snippetsEnabled) { StackExchange.using("snippets", function() { createEditor(); }); } else { createEditor(); } }); function createEditor() { StackExchange.prepareEditor({ heartbeatType: 'answer', convertImagesToLinks: true, noModals: false, showLowRepImageUploadWarning: true, reputationToPostImages: 10, bindNavPrevention: true, postfix: "", onDemand: true, discardSelector: ".discard-answer" ,immediatelyShowMarkdownHelp:true }); } });
 
StackExchange.ready( function () { StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f40223740%2fmulti-tenancy-with-mongodb-and-gorm%23new-answer', 'question_page'); } );

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Browse other questions tagged mongodb grails gorm multi-tenant or ask your own question.

StackExchange.ready(function(){$.get('/posts/40223740/ivc/6ae4');});
StackExchange.ready(function () { StackExchange.responsiveness.addSwitcher(); }) (function(i, s, o, g, r, a, m) { i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function() { (i[r].q = i[r].q || []).push(arguments) }, i[r].l = 1 * new Date(); a = s.createElement(o), m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m); })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga'); StackExchange.ready(function () { StackExchange.ga.init({ sendTitles: true, tracker: window.ga, trackingCodes: [ 'UA-108242619-1' ] }); StackExchange.ga.setDimension('dimension2', '|mongodb|grails|gorm|multi-tenant|'); StackExchange.ga.setDimension('dimension3', 'Questions/Show'); StackExchange.ga.trackPageView(); }); /**/ var _qevents = _qevents || [], _comscore = _comscore || []; (function() { var ssl = 'https:' == document.location.protocol, s = document.getElementsByTagName('script')[0], qc = document.createElement('script'); qc.async = true; qc.src = (ssl ? 'https://secure' : 'http://edge') + '.quantserve.com/quant.js'; s.parentNode.insertBefore(qc, s); _qevents.push({ qacct: "p-c1rF4kxgLUzNc" }); /**/ var sc = document.createElement('script'); sc.async = true; sc.src = (ssl ? 'https://sb' : 'http://b') + '.scorecardresearch.com/beacon.js'; s.parentNode.insertBefore(sc, s); _comscore.push({ c1: "2", c2: "17440561" }); })();
You need to login account before you can post.

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

© 2016 Powered by mzan.com design MATCHINFO