当前位置: 首页 > 知识库问答 >
问题:

使用Spring和Hibernate在多租户环境中访问数据的策略

司空健
2023-03-14

我在一个多租户环境中工作,在这个环境中,数据可以从大约10个不同的数据源(和实体管理器)通过网络应用程序(rest)前端访问。

要使用的entityManager取决于其余api中的URL参数,例如。api/订单/1/1000003。

我需要使用entitymanager“1”来获取数据。目前,在创建hibernate会话和通过hibernate条件创建查询之前,我正在使用存储库层中调用setDistrict(1)的方法。

一切正常,但我担心的是,该方法需要同步,以避免从错误的entitymanager获取数据。当我同步存储库方法时,我担心性能会很糟糕。。

实现这种多租户访问的好策略是什么,这样性能会很好,并且在重载情况下也会返回正确的数据?

谢谢你的建议。

共有1个答案

颜祖鹤
2023-03-14

Hibernate的SessionFactory允许使用租赁行为:

>

数据库与单独的数据库方法相关。尝试使用此策略打开没有租户标识符的会话是错误的。此外,还有一个组织。冬眠服务jdbc。连接。spi。必须指定MultiTenantConnectionProvider。

鉴别器与分区(鉴别器)方法相关。尝试使用此策略打开没有租户标识符的会话是错误的。从4.0和4.1开始,这个策略还没有在Hibernate中实现。它的支持计划为5.0。

在您的情况下,我认为您需要SCHMA或DATABASE,并且必须实现MultiTenantConnectionProvider(源)。

/**
 * Simplisitc implementation for illustration purposes supporting 2 hard coded providers (pools) and leveraging
 * the support class {@link org.hibernate.service.jdbc.connections.spi.AbstractMultiTenantConnectionProvider}
 */
public class MultiTenantConnectionProviderImpl extends AbstractMultiTenantConnectionProvider {
    private final ConnectionProvider acmeProvider = ConnectionProviderUtils.buildConnectionProvider( "acme" );
    private final ConnectionProvider jbossProvider = ConnectionProviderUtils.buildConnectionProvider( "jboss" );

    @Override
    protected ConnectionProvider getAnyConnectionProvider() {
        return acmeProvider;
    }

    @Override
    protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) {
        if ( "acme".equals( tenantIdentifier ) ) {
            return acmeProvider;
        }
        else if ( "jboss".equals( tenantIdentifier ) ) {
            return jbossProvider;
        }
        throw new HibernateException( "Unknown tenant identifier" );
    }
}

有关更多详细信息,请参阅链接文档。

 类似资料:
  • 我试图掌握如何使用Hibernate、Spring和MySQL实现多租户。对于第一个游乐场示例,我选择了单独的数据库方法:每个租户都有自己的数据库,名为accodingly。此外,还使用另一个数据库来管理租户。特定于租户的数据库保存了一些员工数据。对于第一种方法,我不强制用户进行身份验证。 我发现很难得到关于这个话题的全面教程,这就是为什么我现在有点迷路。当我尝试部署Tomcat时,会收到以下消息

  • 我最近在工作中遇到了以下架构问题,我不确定这里的最佳做法。 我们为学校提供了一个多租户SAAS应用程序,其体系结构与一个中央主数据库(包含配置和共享数据)以及每个“学校组”的一个特定数据库配合使用。这些群体通常具有地域性,学校合作并为他们的群体取得软件许可证。 这在过去带来了一些问题,因为有时学校会改变群体。我们通过创建一个迁移工具来解决这个问题,该工具从一个数据库中提取学校数据,并将其合并到其他

  • 每个租户都有自己的数据库,可以更详细地处理用户,并且需要有一个中央数据库来处理: 代币(OAuth2) 我已经找到了多租户的解决方案,它允许我根据用户确定数据源。然而,我不确定如何将某些crud存储库链接到这个中心数据源,而将其他存储库链接到可变数据源。 另一个解决方案涉及更新属性文件,并使用配置服务器(即通过git)来触发@ReresScope注释配置。虽然我不确定这是否适用于数据源,或者这是否

  • 这很有效,所以看起来。上面指定的作用域是由域确定的多租户环境中为一个租户定义的自定义作用域。但我认为,为了这个问题的目的,这也可能是会话范围。我在这里的想法是,TemplateResolver对于每个范围都是不同的。我们需要它是因为我们正在从租户的数据库中读取模板。 最后,我的症状:似乎第一个房客工作很好。对于任何后续租户,我在试图处理数据库模板时都会遇到异常。 我尝试禁用Thymeleaf的Sp

  • 我正在使用Spring2.x、Spring Data REST、Hibernate5.x、MySQL创建一个服务器REST应用程序。 我按照以下准则配置了多租户:https://dzone.com/articles/spring-boot-hibernate-multitenancy-implementation,唯一的区别是我使用了每个租户一个数据库。 我有一个来创建到DB的连接,还有一个来获取

  • 我认为为每个租户创建一个Redis实例是一个很好的解决方案。 我有一个包含租户id和Redisendpoint的映射,这是专用于这个租户的。 地图数据如下所示: