Hi, 

While this post is ancient now, i am wondering if there is a solution for 
this. I am in a situation where in i need to achieve multi tenancy and each 
tenant would have a separate database. My DW services use hibernate

Thanks

On Friday, 23 January 2015 09:14:00 UTC+5:30, Daniel Theodosius wrote:
>
> We found workaround for this. We created a new annotation called 
> MultiTenantUnitOfWork and MultiTenantUnitOfWorkApplicationListener that is 
> based on UnitOfWork and UnitOfWorkApplicationListener.
>
> The difference is inside the MultiTenantUnitOfWorkApplicationListener 
> onEvent method:
>
>         @Override
>         public void onEvent(RequestEvent event) {
>             if (event.getType() == 
> RequestEvent.Type.RESOURCE_METHOD_START) {
>                 this.unitOfWork = this.methodMap.get(event.getUriInfo()
>                         
> .getMatchedResourceMethod().getInvocable().getDefinitionMethod());
>                 if (unitOfWork != null) {
>                     this.session = this.sessionFactory.openSession();
>                     setSchema(); //set the schema to the connection
>                     try {
>                         configureSession();
>                         ManagedSessionContext.bind(this.session);
>                         beginTransaction();
>                     } catch (Throwable th) {
>                         this.session.close();
>                         this.session = null;
>                         ManagedSessionContext.unbind(this.sessionFactory);
>                         throw th;
>                     }
>                 }
>             } else if (event.getType() == 
> RequestEvent.Type.RESOURCE_METHOD_FINISHED) {
>                 if (this.session != null) {
>                     try {
>                         commitTransaction();
>                     } catch (Exception e) {
>                         rollbackTransaction();
>                         this.<RuntimeException>rethrow(e);
>                     } finally {
>                         this.session.close();
>                         this.session = null;
>                         ManagedSessionContext.unbind(this.sessionFactory);
>                     }
>                 }
>             } else if (event.getType() == RequestEvent.Type.ON_EXCEPTION) {
>                 if (this.session != null) {
>                     try {
>                         rollbackTransaction();
>                     } finally {
>                         this.session.close();
>                         this.session = null;
>                         ManagedSessionContext.unbind(this.sessionFactory);
>                     }
>                 }
>             }
>         }
>
>         private void setSchema() {
>             this.session.doWork(connection -> {
>
>                 String schemaStatement = null;
>                 final String tenantSchema = <YOUR_SCHEMA>;
>                 switch 
> (dataSourceFactory.getProperties().get("hibernate.dialect")) {
>                     case "org.hibernate.dialect.PostgreSQL9Dialect":
>                         schemaStatement = String.format("SET SEARCH_PATH = 
> %s", tenantSchema);
>                         break;
>                     default:
>                         schemaStatement = String.format("SET SCHEMA = %s", 
> tenantSchema);
>                 }
>
>                 PreparedStatement preparedStatement = 
> connection.prepareStatement(schemaStatement);
>                 preparedStatement.execute();
>             });
>         }
>
> The idea is to use the connection from the opened session and set the 
> schema by using the connection. But the fallback is you need to specify 
> each of the SQL statement because most of the jdbc connections do not 
> implement setSchema() method that might be useful.
>
> On Wednesday, January 21, 2015 at 4:04:00 PM UTC+11, Yun Zhi Lin wrote:
>>
>>
>> We are also getting Null pointer exception. It may be the same issue.
>>
>> It appears that every time "hibernate.multiTenancy" is set, either the 
>> dialect or JdbcService will give NullPointer exception. The error can be 
>> narrowed down to line 1887 to 1888 in
>>  org.hibernate.cfg.Configuration.java:
>>
>> final Dialect dialect = serviceRegistry.getService( JdbcServices.class 
>> ).getDialect();
>> dialect.contributeTypes( typeContributions, serviceRegistry );
>>
>>
>>
>> On Saturday, January 17, 2015 at 2:58:20 AM UTC+11, Lee Carraher wrote:
>>>
>>> Have you had any luck getting multi tenancy to work?
>>>
>>> I tried editing io.dropwizard.hibernate.UnitOfWorkRequestDispatcher as  
>>> public void dispatch(Object resource, HttpContext context) {
>>>         //final Session session = sessionFactory.openSession();
>>>         final Session session = 
>>> sessionFactory.withOptions().tenantIdentifier("Tenant1").openSession();
>>>
>>> Which fails since the datasource is not configured for multi tenant, 
>>> which lead me to add: 
>>>         configuration.setProperty("hibernate.multiTenancy","SCHEMA");
>>>         
>>> configuration.setProperty(AvailableSettings.MULTI_TENANT_IDENTIFIER_RESOLVER,
>>>  
>>> "com.company.CurrentTenantIdentifierResolverImpl");
>>>         
>>> configuration.setProperty("hibernate.tenant_identifier_resolver","com.company.MultiTenantConnectionProviderImpl");
>>> to buildSessionFactory io.dropwizard.hibernate.SessionFactoryFactory
>>>
>>> and implemented CurrentTenantIdentifierResolverImpl and 
>>> MultiTenantConnectionProviderImpl as in
>>>
>>> http://blog.sandeepgupta.info/2014/07/making-application-multi-tenant-with.html
>>>  
>>> (stripping out any spring only stuff)
>>> however i still get a null pointer somewhere deep in the stack trace 
>>> that i can't resolve.
>>>
>>> Has anyone had any luck getting multitenancy to work?
>>>
>>>
>>>
>>> On Thursday, March 13, 2014 at 11:40:35 AM UTC-4, Gökhan Berberoğlu 
>>> wrote:
>>>>
>>>> thank for pointing me UnitOfWorkRequestDispatcher.. will definitelly 
>>>> try.   
>>>>
>>>>
>>>>
>>>> On Monday, March 10, 2014 10:59:53 AM UTC+1, Graham O'Regan wrote:
>>>>>
>>>>> Dropwizard doesn’t support Hibernate’s multi-tenancy feature OOTB, 
>>>>> when sessions are created using @UnitOfWork the tenant’s identifier isn’t 
>>>>> known so it cannot be passed to the SessionFactory’s options. If you 
>>>>> wanted 
>>>>> to add support you could modify the UnitOfWorkRequestDispatcher to 
>>>>> extract 
>>>>> the tenant’s 
>>>>> identifier from the HttpContext and pass it through when the session 
>>>>> is created?
>>>>>
>>>>>
>>>>>
>>>>> On 9 Mar 2014, at 14:10, Nathan Fisher <[email protected]> wrote:
>>>>>
>>>>> Hi Gökhan,
>>>>>
>>>>> There's no reason you *cannot* do it with Dropwizard (that I'm aware 
>>>>> of). I just don't think it's the target fit for dropwizard. The primary 
>>>>> focus of it is restful web-services that are easily deployed and 
>>>>> monitored. 
>>>>> Consider the context and organisation where it was built (Yammer/back end 
>>>>> services) and that will give you a sense of what its target application 
>>>>> is.
>>>>>
>>>>> All that being said dropwizard has done a pretty good job of not 
>>>>> limiting your options. Folks have successfully integrated a number of 
>>>>> components into dropwizard that weren't included (eg spring, various DB 
>>>>> orms, templating engines, etc). So the can in my mind is yes.
>>>>>
>>>>> Questions I would pose;
>>>>>
>>>>> 1) how many databases and clients are you looking at?
>>>>> 2) is this likely to grow in the future, by how much?
>>>>> 3) is the schema uniform across databases?
>>>>> 4) what's the expected RPS per client/database and is it relatively 
>>>>> uniform?
>>>>> 5) do you have sla latency requirements?
>>>>> 6) do you have sla availability requirements?
>>>>>
>>>>> Kind Regards,
>>>>> Nathan
>>>>>
>>>>> On Saturday, 8 March 2014, Gökhan Berberoğlu <[email protected]> 
>>>>> wrote:
>>>>>
>>>>>> Hi Nathan,
>>>>>>
>>>>>> We're investigating DW for a new project..  We were planning to use 
>>>>>> Hibernate's separate database per tenant approach, possibly with DW.. 
>>>>>> Your 
>>>>>> answer  #1 answer is not clear to me, do you think DW is not ok for 
>>>>>> multi-tenant / multi-db environments ?
>>>>>>
>>>>>> I assumed since multi-tenancy is natively supported with hibernate it 
>>>>>> should just work with DW, however after OP's post I realize that won't 
>>>>>> be 
>>>>>> the case.. I cannot find any information regarding DW & multi-tenancy, 
>>>>>> which is quite worrying.. 
>>>>>>
>>>>>> Can you elaborate your answer please ? 
>>>>>>
>>>>>> thanks!
>>>>>>  
>>>>>> On Thursday, February 6, 2014 4:53:51 PM UTC+1, Nathan Fisher wrote:
>>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> Are you trying to architect your platform or integrate with an 
>>>>>>> existing brownfield project?  Are the databases shards for scaling or 
>>>>>>> are 
>>>>>>> they distinct datasets?
>>>>>>>
>>>>>>> My quick and dirty response with the questions you've asked thus far;
>>>>>>>
>>>>>>> 1. If you're connecting to that many DB's I think you're no longer 
>>>>>>> in the land of micro-service architecture.
>>>>>>> 2. You'd need to test it with your queries.  Define the desired 
>>>>>>> performance 
>>>>>>> 3. Use a reverse-proxy or load balancer, DNS load balancing should 
>>>>>>> be your last resort (http://www.tenereillo.com/GSLBPageOfShame.htm).
>>>>>>>
>>>>>>> Kind Regards,
>>>>>>> Nathan
>>>>>>>
>>>>>>>
>>>>>>> On 6 February 2014 10:33, S Ahmed <[email protected]> wrote:
>>>>>>>
>>>>>>>> When dealing with a multi-tenant environment, many issues can come 
>>>>>>>> up if you don't set things up correctly.
>>>>>>>>
>>>>>>>> I was wondering if those of you who have large scale DW 
>>>>>>>> deployments, how do you go about setting up DW in terms of multiple db 
>>>>>>>> connections?
>>>>>>>>
>>>>>>>> 1. Say you have 10 databases to connect to, do you create 10 
>>>>>>>> session contexts?
>>>>>>>> 2. If you set your active connections to high, say 100, then if you 
>>>>>>>> have 10 servers that means you have 10x100 active connections into 
>>>>>>>> mysql. 
>>>>>>>>  What have you found to be a reasonable maximum?
>>>>>>>> 3. Is it easier to somehow direct traffic to a group of DW servers 
>>>>>>>> that all connect to a single instance?  ie. spread traffic at the dns 
>>>>>>>> level 
>>>>>>>> somehow based on subdomain or the like.
>>>>>>>>
>>>>>>>> -- 
>>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>>> Groups "dropwizard-user" group.
>>>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>>> send an email to [email protected].
>>>>>>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> -- 
>>>>>>> Nathan Fisher
>>>>>>>  w: http://junctionbox.ca/
>>>>>>>
>>>>>>
>>>>>> -- 
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "dropwizard-user" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>> send an email to [email protected].
>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>
>>>>>
>>>>>
>>>>> -- 
>>>>> Nathan Fisher
>>>>>  w: http://junctionbox.ca/
>>>>>
>>>>>
>>>>> -- 
>>>>> You received this message because you are subscribed to the Google 
>>>>> Groups "dropwizard-user" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>> an email to [email protected].
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>>>
>>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"dropwizard-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to