Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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 多租户休眠+;Spring boot-如何防止它在服务器启动期间查找连接_Hibernate_Spring Boot_Multi Tenant - Fatal编程技术网

Hibernate 多租户休眠+;Spring boot-如何防止它在服务器启动期间查找连接

Hibernate 多租户休眠+;Spring boot-如何防止它在服务器启动期间查找连接,hibernate,spring-boot,multi-tenant,Hibernate,Spring Boot,Multi Tenant,我们正在使用多租户hibernate+Spring引导,如中所述。在创建实体管理器时,我们提供了MultiTenantConnectionProvider和CurrentTenantIdentifierResolver(请参阅下面的示例) 在我们的MultiTenantConnectionProvider中,租户的目标数据库不是静态配置的。相反,它通过调用另一个服务动态确定当前租户的目标数据库详细信息,然后为其创建数据源 现在,我们面临一个问题,当spring启动服务器启动时,Hibernate

我们正在使用多租户hibernate+Spring引导,如中所述。在创建实体管理器时,我们提供了MultiTenantConnectionProvider和CurrentTenantIdentifierResolver(请参阅下面的示例)

在我们的MultiTenantConnectionProvider中,租户的目标数据库不是静态配置的。相反,它通过调用另一个服务动态确定当前租户的目标数据库详细信息,然后为其创建数据源

现在,我们面临一个问题,当spring启动服务器启动时,Hibernate正在调用MultitenantConnectionProvider.getAnyConnection()方法。在服务器启动时,上下文中没有租户,因此我们没有任何数据库来创建连接。此外,我们的设置中没有任何虚拟数据库,可以在服务器启动时使用

  • 如果返回null,服务器启动将失败,并出现NullPointerException
  • 如果重写anyConnection()方法并抛出异常(如下面的代码所示),服务器只会记录异常并继续启动服务器
  • 有了2,一切都很顺利,我们能够取得进展。但是,我们确实希望在每次重新启动spring引导服务器时都能消除记录的这种不必要的异常

    我们正在寻找一种方法来关闭hibernate在服务器启动期间尝试连接到db的行为,特别是在设置hibernate的多租户策略时。对于多租户软件,此行为不一致

    有什么方法可以防止Hibrate在服务器启动期间尝试获取连接(即调用MultitenantConnectionProvider.getAnyConnection())吗

    请告知

    下面是我们的Spring配置示例

    @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");
        }
    }