是否使用Hibernate的专用功能实现多租户?
在使用Hibernate 4.1.12开发多租户Java web应用程序时,我们发现两种配置模式似乎都能正常工作,一种具有Hibernate多租户功能,另一种没有 hibernate.cfg.xml如下所示:是否使用Hibernate的专用功能实现多租户?,hibernate,multi-tenant,Hibernate,Multi Tenant,在使用Hibernate 4.1.12开发多租户Java web应用程序时,我们发现两种配置模式似乎都能正常工作,一种具有Hibernate多租户功能,另一种没有 hibernate.cfg.xml如下所示: <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Standard configuration -->
<property name="hibernate.dialect">org.hibernate.dialect.DB2Dialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">false</property>
<property name="hibernate.connection.autocommit">true</property><!-- legacy non-transactional DB -->
<!-- HERE LIES THE MULTITENANCY CONFIGURATION -->
<!-- Persistent classes -->
<mapping class="com.foo.model.Bar1"/>
<mapping class="com.foo.model.Bar2"/>
<!-- Other entities here -->
</session-factory>
org.hibernate.dial.DB2Dialect
真的
假的
真的
“具有Hibernate多租户功能”的多租户配置为:
数据库
com.foo.hibernate.TenantResolverImpl
com.foo.hibernate.MultiTenantConnectionProviderImpl
com.foo.hibernate.CurrentSessionContextImpl
假的
“无休眠多租户功能”的多租户配置为:
com.foo.hibernate.ConnectionProviderImpl
com.foo.hibernate.CurrentSessionContextImpl
假的
一些实施细节:
- TenantResolverImpl返回从本地线程获取的当前租户的名称
- MultiTenantConnectionProviderImpl和ConnectionProviderImpl从JDBC数据源返回连接,该数据源的JNDI名称是根据租户名称构建的(例如字符串datasourceName=“java:comp/env/”+tenantName“\u DS”
- CurrentSessionContextImpl在ThreadLocal中存储多个会话,其中字符串是租户名称(我们不使用Hibernate“current session”实现,因为我在中描述了这一点)
感谢您的时间。最好使用显式表单和
hibernate.Multitenance
一起使用,它会执行一些额外的健全性检查,并且在将来多租户中涉及新服务/组件时更能证明未来
但显式执行的主要是hibernate.Multitenance。它在您的情况下起作用,因为您基本上决定实现自己的连接提供程序,禁用JDBC元数据检查,并且不使用模式生成功能(在“非显式multitenant”配置中)
<!-- Multitenancy configuration (with Hibernate multitenancy support) -->
<property name="hibernate.multiTenancy">DATABASE</property>
<property name="hibernate.tenant_identifier_resolver">com.foo.hibernate.TenantResolverImpl</property>
<property name="hibernate.multi_tenant_connection_provider">com.foo.hibernate.MultiTenantConnectionProviderImpl</property>
<property name="hibernate.current_session_context_class">com.foo.hibernate.CurrentSessionContextImpl</property>
<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
<!-- Multitenancy configuration (without Hibernate multitenancy suport, only home made multitenancy) -->
<property name="hibernate.connection.provider_class">com.foo.hibernate.ConnectionProviderImpl</property>
<property name="hibernate.current_session_context_class">com.foo.hibernate.CurrentSessionContextImpl</property>
<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>