Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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
Java 使用eclipselink实现多租户的正确方法是什么_Java_Eclipselink_Multi Tenant - Fatal编程技术网

Java 使用eclipselink实现多租户的正确方法是什么

Java 使用eclipselink实现多租户的正确方法是什么,java,eclipselink,multi-tenant,Java,Eclipselink,Multi Tenant,您好,我正在使用Vaadin框架、JPA EclipseLink作为ORM、MYSQL作为数据库开发一个web应用程序。目前我正在为我的应用程序实现多租户结构。在这里,我必须选择共享数据库策略中具有不同模式的表\u PER\u租户,因为我已经有了一些租户 以下是我的租户特定实体的示例: @Entity @Multitenant(MultitenantType.TABLE_PER_TENANT) @TenantTableDiscriminator(type = TenantTableDiscrim

您好,我正在使用Vaadin框架、JPA EclipseLink作为ORM、MYSQL作为数据库开发一个web应用程序。目前我正在为我的应用程序实现多租户结构。在这里,我必须选择共享数据库策略中具有不同模式的表\u PER\u租户,因为我已经有了一些租户

以下是我的租户特定实体的示例:

@Entity
@Multitenant(MultitenantType.TABLE_PER_TENANT)
@TenantTableDiscriminator(type = TenantTableDiscriminatorType.SCHEMA, contextProperty = PersistenceUnitProperties.MULTITENANT_PROPERTY_DEFAULT)
public class UserAccount implements Serializable {
......
}
以下是persistence.xml中租户的持久化单元:

<persistence-unit name="PU" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>Includes all tenant table class</class>
        <properties>
            <property name="eclipselink.cache.shared.default" value="false"/>
            <!-- container isn upcloud ??-->
             <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/?rewriteBatchedStatements=true&amp;characterEncoding=UTF-8&amp;connectionCollation=utf8_general_ci&amp;zeroDateTimeBehavior=convertToNull&amp;useUnicode=true&amp;connectionCollation=utf8_general_ci&amp;characterSetResults=utf8&amp;characterEncoding=utf8&amp;characterEncoding=UTF-8&amp;characterSetResults=UTF-8"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="root"/>

            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
            <property name="eclipselink.jdbc.batch-writing" value="JDBC"/>
            <property name="eclipselink.jdbc.batch-writing.size" value="1000"/>
            <property name="hibernate.connection.useUnicode" value="true"/>
            <property name="hibernate.connection.characterEncoding" value="UTF-8"/>
        </properties>
    </persistence-unit>
在应用程序中,用户可以登录到特定租户(他已授予访问权限)。因此,一次只能访问一个租户的数据

我的应用程序采用多租户的方式是否正确?
有什么改进吗?

可以使用ThreadLocal,如下所示:

public class TenantContext {
  private static final ThreadLocal<String> TENANT_TL = new ThreadLocal<>();

  public static String getTenantId() {
    return TENANT_TL.get();
  }

  public static void setTenantId(String tenantId) {
    TENANT_TL.set(tenantId);
  }
}
我使用Eclipse链接和Spring数据创建了一个关于多租户(每个租户表)的java示例。只需对代码进行最小的更改,即可将现有应用程序转换为多租户。这是使用字节码检测完成的。选择此想法是为了利用Spring数据的全部功能

人们可以通过执行来看到它的工作

这个想法是开源的,可以在

em = createTenantSpecificEntityManager();
em.getTransaction().begin();
       em.setProperty(EntityManagerProperties.MULTITENANT_PROPERTY_DEFAULT, \COMPANY_NAME_AS_TENENT_ID);
.......
Do any operation here
.......
em.getTransaction().commit();
em.close();
public class TenantContext {
  private static final ThreadLocal<String> TENANT_TL = new ThreadLocal<>();

  public static String getTenantId() {
    return TENANT_TL.get();
  }

  public static void setTenantId(String tenantId) {
    TENANT_TL.set(tenantId);
  }
}
em.setProperty(EntityManagerProperties.MULTITENANT_PROPERTY_DEFAULT, TenantContext.getTenantId());