Hibernate 多租户休眠+;Spring boot-如何防止它在服务器启动期间查找连接
我们正在使用多租户hibernate+Spring引导,如中所述。在创建实体管理器时,我们提供了MultiTenantConnectionProvider和CurrentTenantIdentifierResolver(请参阅下面的示例) 在我们的MultiTenantConnectionProvider中,租户的目标数据库不是静态配置的。相反,它通过调用另一个服务动态确定当前租户的目标数据库详细信息,然后为其创建数据源 现在,我们面临一个问题,当spring启动服务器启动时,Hibernate正在调用MultitenantConnectionProvider.getAnyConnection()方法。在服务器启动时,上下文中没有租户,因此我们没有任何数据库来创建连接。此外,我们的设置中没有任何虚拟数据库,可以在服务器启动时使用Hibernate 多租户休眠+;Spring boot-如何防止它在服务器启动期间查找连接,hibernate,spring-boot,multi-tenant,Hibernate,Spring Boot,Multi Tenant,我们正在使用多租户hibernate+Spring引导,如中所述。在创建实体管理器时,我们提供了MultiTenantConnectionProvider和CurrentTenantIdentifierResolver(请参阅下面的示例) 在我们的MultiTenantConnectionProvider中,租户的目标数据库不是静态配置的。相反,它通过调用另一个服务动态确定当前租户的目标数据库详细信息,然后为其创建数据源 现在,我们面临一个问题,当spring启动服务器启动时,Hibernate
@Configuration
@EnableTransactionManagement
public class MultiTenantHibernateJpaConfig {
@Autowired
private JpaProperties jpaProperties;
@Bean
public MultiTenantConnectionProvider multiTenantConnectionProvider() {
return new MultiTenantConnectionProviderImpl();
}
@Bean
public CurrentTenantIdentifierResolver currentTenantIdentifierResolver() {
return new CurrentTenantIdentifierResolverImpl();
}
@Value("${jpaconfig.packages-to-scan:#{null}}")
private String packagesToScan;
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactory(MultiTenantConnectionProvider multiTenantConnectionProvider,
CurrentTenantIdentifierResolver currentTenantIdentifierResolver) {
Map<String, Object> hibernateProps = new LinkedHashMap<>();
hibernateProps.put(Environment.MULTI_TENANT, MultiTenancyStrategy.SCHEMA);
hibernateProps.put(Environment.MULTI_TENANT_CONNECTION_PROVIDER, multiTenantConnectionProvider);
hibernateProps.put(Environment.MULTI_TENANT_IDENTIFIER_RESOLVER, currentTenantIdentifierResolver);
hibernateProps.put("javax.persistence.schema-generation.database.action", "none");
hibernateProps.put("javax.persistence.query.timeout", "5");
hibernateProps.put(Environment.DIALECT, "org.hibernate.dialect.Oracle10gDialect");
hibernateProps.putAll(this.jpaProperties.getProperties());
LocalContainerEntityManagerFactoryBean result = new LocalContainerEntityManagerFactoryBean();
if(packagesToScan != null) {
//handle multiple packages separated by comma
result.setPackagesToScan(packagesToScan.split("\\s*,\\s*"));
}
result.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
result.setJpaPropertyMap(hibernateProps);
return result;
}
这只在启动时调用,为什么不在启动时使用默认的租户标识符呢 更新:
因此,如果这是不可能的。为什么不使用DummyConnection类实现连接接口,并在启动时返回该接口 谢谢。这是一个可能的选择。但是,目前我们没有默认数据库。只有租户在船上时,数据库才可用。我们正在寻找一种方法来关闭hibernate在服务器启动期间尝试连接到db的行为,特别是在设置hibernate的多租户策略时。对于多租户软件,此行为不一致
public class MultiTenantConnectionProviderImpl extends AbstractDataSourceBasedMultiTenantConnectionProviderImpl {
private static final long serialVersionUID = 1L;
public MultiTenantConnectionProviderImpl()
{
}
@Override
protected DataSource selectAnyDataSource()
{
return null;
}
@Override
protected DataSource selectDataSource(String tenantIdentifier) {
//This in turn makes a call to a remote service to fetch current tenant
//database details and then creates a datasource for it.
return DataSourceManager.getDataSource(tenantIdentifier);
}
@Override
public Connection getAnyConnection() throws SQLException{
//Called during server startup. Cannot do any thing as tenant is not known
// and there is no default datasource
throw new SQLException("not implemented in multi-tenant environment");
}
@Override
public void releaseAnyConnection(Connection connection) throws SQLException
{
//Called during server startup. Cannot do any thing as tenant is not known
// and there is no default datasource
throw new SQLException("not implemented in multi-tenant environment");
}
}