[hibernate-dev] multi-tenancy and ConnectionProvider
Emmanuel Bernard
emmanuel at hibernate.org
Tue Mar 29 16:39:37 EDT 2011
There is something that is escaping me.
In your view, you would have one ConnectionProvider implementation per underlying multi-tenant strategy + connection lookup strategy?
ie
JNDIDatasourceConnectionProvider (no multi tenancy support)
SchemaJNDIDatasourceConnectionProvider (multi tenancy with one tenant per schema)
VPDJNDIDatasourceConnectionProvider (multi tenancy delegating isolation to the VPD tech)
And one could write a C3P0 alternative etc for these three if he is motivated.
Or is that something else?
Emmanuel
On 29 mars 2011, at 19:52, Steve Ebersole wrote:
> Maybe i am just missing the point of your specific passed values.
> As currently implemented we really expect a custom ConnectionProvider to deal with the tenant identifier. I really only see JNDI-based DataSourceConnectionProvider as something for which we might reasonable supply a implementation.
> To be honest the ConnectionProvider is not the difficult part to this. The isolation within the Session and second level cache are by far the more useful things.
> Of course I am open to suggestions here if anyone thinks we should provide support for concrete, tenant-aware ConnectionProviders out-of-the-box *and* has an idea what that looks like and how to actually do it in a clean way.
> On Tuesday, March 29, 2011, at 12:36 pm, Emmanuel Bernard wrote:
> > The reason I initially pushed the difference is because one could imagine
> > some kind of map between the tenantId passed tot he session and the schema
> > name that end up being used. But that might be a bit over engineered and
> > the tenant id + tenantType (tenantStrategy is probably better) is enough
> > info.
> >
> > Emmanuel
> >
> > On 29 mars 2011, at 18:30, Steve Ebersole wrote:
> > > The connection provider is different yes. The information needed is the
> > > same.
> > >
> > > For VPD you issues an ALTER SESSION command on the connection to tell it
> > > the "tenant"
> > >
> > > On Tuesday, March 29, 2011, at 11:22 am, Emmanuel Bernard wrote:
> > >> Yes but on top of Oracle, I could use the VPD approach or the more
> > >> portable but less integrated schema approach, right? Somehow the user
> > >> will be able to chose and the connection provider will do different
> > >> magic tricks. Or am I missing some step?
> > >>
> > >> On 29 mars 2011, at 17:43, Steve Ebersole wrote:
> > >>> VPD is really the same notion as a tenant. So the ConnectionProvider
> > >>> having access to the tenant already solves that
> > >>>
> > >>> On Tuesday, March 29, 2011, at 10:31 am, Emmanuel Bernard wrote:
> > >>>> For info, I like #2 the best
> > >>>>
> > >>>> ConnectionOptions can deal in the future with:
> > >>>> - schema based diff
> > >>>> - user based diff ala Oracle VPD
> > >>>>
> > >>>> interface ConnectionOptions {
> > >>>>
> > >>>> TenantType getTenantType();
> > >>>> String getDefaultSchema();
> > >>>> String getUser() //is that how VPD filters out?
> > >>>> ..some more techniques later
> > >>>>
> > >>>> }
> > >>>>
> > >>>> enum TenantType {
> > >>>>
> > >>>> NONE,
> > >>>> SCHEMA,
> > >>>> USER
> > >>>>
> > >>>> }
> > >>>>
> > >>>> With getTenantType, a ConnectionProvider can return the right
> > >>>> connection or yell if it does not support it. We could also imagine
> > >>>> asking the ConnectionProvider to return the array of supported
> > >>>> tenantTypes so that we can raise the exception at startup time.
> > >>>>
> > >>>> On 22 mars 2011, at 22:21, Steve Ebersole wrote:
> > >>>>> reference
> > >>>>> http://opensource.atlassian.com/projects/hibernate/browse/HHH-5697
> > >>>>>
> > >>>>> For multi-tenancy implemented by sepaerate schema we need the ability
> > >>>>> to tell the ConnectionProvider about the tenant for the given
> > >>>>> getConnection() request. I really see 3 approaches to this:
> > >>>>>
> > >>>>> 1) Have 2 hierarchies here. The current ConnectionProvider contract
> > >>>>> remains the same. Add a new MultiTenantConnectionProvider with
> > >>>>> methods accounting for tenant
> > >>>>> 2) Just alter the ConnectionProvider contract to pass information in.
> > >>>>> If we go this route I prefer the "parameter object" pattern where we
> > >>>>> pass in ConnectionOptions interface (see issue).
> > >>>>> 3) Use contextual lookup. ConnentionProviders interested in (or
> > >>>>> capable of understanding) mulit-tenancy would perform some kind of
> > >>>>> "contextual" (ThreadLocal, etc) lookup for the needed information.
> > >>>>>
> > >>>>> Thoughts? Discussions?
> > >>>>>
> > >>>>> ---
> > >>>>> Steve Ebersole <steve at hibernate.org>
> > >>>>> http://hibernate.org
> > >>>>> _______________________________________________
> > >>>>> hibernate-dev mailing list
> > >>>>> hibernate-dev at lists.jboss.org
> > >>>>> https://lists.jboss.org/mailman/listinfo/hibernate-dev
> > >>>
> > >>> ---
> > >>> Steve Ebersole <steve at hibernate.org>
> > >>> http://hibernate.org
> > >>> _______________________________________________
> > >>> hibernate-dev mailing list
> > >>> hibernate-dev at lists.jboss.org
> > >>> https://lists.jboss.org/mailman/listinfo/hibernate-dev
> > >
> > > ---
> > > Steve Ebersole <steve at hibernate.org>
> > > http://hibernate.org
> > > _______________________________________________
> > > hibernate-dev mailing list
> > > hibernate-dev at lists.jboss.org
> > > https://lists.jboss.org/mailman/listinfo/hibernate-dev
> ---
> Steve Ebersole <steve at hibernate.org>
> http://hibernate.org
More information about the hibernate-dev
mailing list