Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否使用Hibernate的专用功能实现多租户?_Hibernate_Multi Tenant - Fatal编程技术网

是否使用Hibernate的专用功能实现多租户?

是否使用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"

在使用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>

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返回从本地线程获取的当前租户的名称
  • MultiTenantConnectionProviderImplConnectionProviderImpl从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>