Hibernate使用其专用功能的多租户?

时间:2014-07-22 13:32:01

标签: 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"
    "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>

多租户配置&#34;具有Hibernate多租户功能&#34;是:

    <!-- 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>

多租户配置&#34;没有Hibernates多租户功能&#34;是:

    <!-- 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>

一些实施细节:

  • TenantResolverImpl 返回当前租户的名称,该名称来自本地线程
  • MultiTenantConnectionProviderImpl ConnectionProviderImpl 从租户名称构建JNDI名称的JDBC数据源返回连接(例如String datasourceName =&#34; java:comp / env /&#34; + tenantName&#34; _DS&#34;
  • CurrentSessionContextImpl 在ThreadLocal&lt; String,Session&gt;中存储多个会话其中String是租户名称(我们不使用Hibernate&#34;当前会话&#34;实现因为我在https://stackoverflow.com/questions/24886780/limitation-of-hibernate-current-session-for-multitenant-application中所描述的内容)

到目前为止,两者都运作良好。

问题是:这两种模式之间有什么区别?

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

最好使用带有hibernate.multiTenancy的显式表单,它会进行一些额外的健全性检查,并且在未来新服务/组件涉及多租户时更具未来性。

但你明确地做的是hibernate.multiTenancy的主要内容。它适用于您的情况,因为您已基本决定实现自己的连接提供程序,禁用JDBC元数据检查并且不使用模式生成功能(在&#34;非显式多租户&#34;配置中)。

相关问题