每个租户的Hibernate数据库多租户连接提供程序正在为单个租户创建多个数据库连接

时间:2019-05-28 05:01:01

标签: java spring hibernate multi-tenant

我想知道休眠的多租户连接提供程序如何以单独的数据库多租户方法处理多个租户的数据库连接。如果我使用相同的租户访问该API,例如1234,则首先应连接到该租户的特定数据库,并且在对同一租户进行几次访问后,它将使用相同的数据库连接,还是会再次为该租户打开新连接同一个房客?

我在每个租户方法中使用了AbstractDataSourceBasedMultiTenantConnectionProviderImplCurrentTenantIdentifierResolver在数据库中的实现方式

class CurrentTenantIdentifierResolver {
    // Other methods + fields
    public String resolveCurrentTenantIdentifier() {        
      String tenantId = TenantContext.getCurrentTenant();       
      return tenantId;  
    }
}

class AbstractDataSourceBasedMultiTenantConnectionProviderImpl {
    // Other methods + fields

    @Override protected DataSource selectDataSource(String tenantIdentifier) {       
      return MultiTenantInitService.getDataSourceMap().get(tenantIdentifier);   
    }
}

class MultiTenantInitService {
    // Other methods + fields

    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(prop.getProperty("spring.jpa.properties.hibernate.driver-class-name"));
    dataSource.setUrl(prop.getProperty("spring.datasource.url"));
    dataSource.setUsername(prop.getProperty("spring.datasource.username"));
    dataSource.setPassword(prop.getProperty("spring.datasource.password"));
    dataSourceMap.put(ApplicationConstants.DEFAULT_TENANT_ID, dataSource);
}

我希望多租户连接提供程序仅在单租户的API首次命中时连接到数据库。它不应一次又一次打开同一租户的连接。与数据库的新连接仅应为新租户形成。但是,如果确实打开了连接,那么它还应该自行管理连接的关闭。

1 个答案:

答案 0 :(得分:0)

我想你想要的是

spring.datasource.max-active=1

此属性限制了到数据库的最大活动连接数。因此,您可以将此属性设置为DataSource并使用它。这意味着您在连接池中只有一个连接。但是这种方法有优点也有缺点,好像无论如何连接都被破坏了,您将不得不创建一个不同的连接来再次在特定的租户上工作。因此,有一个很好的理由要有一个连接池而不是只有一个连接。 因此,更好的解决方案将根据您的需求使用较小的连接池。 如果您的应用程序不断访问数据库,则很明显,您需要一个连接池。因此,我建议您每个租户的连接池较小。

spring.datasource.max-active=5