Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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 Springboot 2.3.1在多租户环境中动态更新Jdbc模板的模式_Java_Database_Spring Boot_Multi Tenant_Jdbctemplate - Fatal编程技术网

Java Springboot 2.3.1在多租户环境中动态更新Jdbc模板的模式

Java Springboot 2.3.1在多租户环境中动态更新Jdbc模板的模式,java,database,spring-boot,multi-tenant,jdbctemplate,Java,Database,Spring Boot,Multi Tenant,Jdbctemplate,我的项目在SpringBootStarter的父版本1.5.9.RELEASE上,我正在将它迁移到SpringBootStarter的父版本2.3.1.RELEASE上 这是一个多租户env应用程序,其中一个数据库将具有多个模式,并且根据租户id,在模式之间切换执行 我使用SimpleNativeJdbcExtractor实现了这种模式切换,但在最新的Springboot版本中,NativeJdbcExtractor不再可用 现有实现的代码段: @Bean @Scope( va

我的项目在SpringBootStarter的父版本1.5.9.RELEASE上,我正在将它迁移到SpringBootStarter的父版本2.3.1.RELEASE上

这是一个多租户env应用程序,其中一个数据库将具有多个模式,并且根据租户id,在模式之间切换执行

我使用SimpleNativeJdbcExtractor实现了这种模式切换,但在最新的Springboot版本中,NativeJdbcExtractor不再可用

现有实现的代码段:

 @Bean
@Scope(
        value = ConfigurableBeanFactory.SCOPE_PROTOTYPE,
        proxyMode = ScopedProxyMode.TARGET_CLASS)
public JdbcTemplate jdbcTemplate() {
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    SimpleNativeJdbcExtractor simpleNativeJdbcExtractor = new SimpleNativeJdbcExtractor() {
        @Override
        public Connection getNativeConnection(Connection con) throws SQLException {
            LOGGER.debug("Set schema for getNativeConnection "+Utilities.getTenantId());
            con.setSchema(Utilities.getTenantId());
            return super.getNativeConnection(con);
        }

        @Override
        public Connection getNativeConnectionFromStatement(Statement stmt) throws SQLException {
            LOGGER.debug("Set schema for getNativeConnectionFromStatement "+Utilities.getTenantId());
            Connection nativeConnectionFromStatement = super.getNativeConnectionFromStatement(stmt);
            nativeConnectionFromStatement.setSchema(Utilities.getTenantId());
            return nativeConnectionFromStatement;
        }
    };

    simpleNativeJdbcExtractor.setNativeConnectionNecessaryForNativeStatements(true);
    simpleNativeJdbcExtractor.setNativeConnectionNecessaryForNativePreparedStatements(true);

    jdbcTemplate.setNativeJdbcExtractor(simpleNativeJdbcExtractor);
    return jdbcTemplate;
}
此处,ThreadLocal中的Utilities.getTenantId存储值将根据REST请求给出架构名称

问题:

NativeJdbcExtractor的备选方案是什么,以便可以动态更改JdbcTemplate的模式? 在创建JDBCTemplatebean时,是否有其他方法可以根据请求设置模式。 我们非常感谢您为解决此问题提供的任何帮助、代码片段或指导


谢谢。

没有必要去掉JdbcTemplate。NativeJdbcExtractor是因为JDBC4不需要它

您应该使用对connection.unwacclass的调用来替换对NativeJdbcExtractor的使用。该方法由JDBC的连接继承


您可能还想考虑使用基于查询键来将连接请求路由到不同的基础数据源的操作。

< P>当我在调试模式下运行应用程序时,我看到沸羊羊正在选择Hikari Datasource。 我必须截获getConnection调用并更新模式

所以我做了如下的事情

创建了一个扩展HikariDataSource的自定义类

public class CustomHikariDataSource extends HikariDataSource {
@Override
public Connection getConnection() throws SQLException {

    Connection connection =  super.getConnection();
    connection.setSchema(Utilities.getTenantId());
    return connection;
}
}
然后在config类中,我为CustomHikariDataSource类创建了bean

 @Bean
public DataSource customDataSource(DataSourceProperties properties) {

    final CustomHikariDataSource dataSource = (CustomHikariDataSource) properties
            .initializeDataSourceBuilder().type(CustomHikariDataSource.class).build();
    if (properties.getName() != null) {
        dataSource.setPoolName(properties.getName());
    }
    return dataSource;
}
JDBCTemplatebean将使用它

 @Bean
@Scope(
        value = ConfigurableBeanFactory.SCOPE_PROTOTYPE,
        proxyMode = ScopedProxyMode.TARGET_CLASS)
public JdbcTemplate jdbcTemplate() throws SQLException {
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    return jdbcTemplate;
}

使用这种方法,我将只创建一次数据源bean,对于每次JdbcTemplate访问,正确的模式将在运行时更新。

*甚至在Springboot2上也可以吗?*我应该去掉JdbcTemplate吗?需要大量的编码和测试工作*我应该停止迁移吗?它允许我在数据源下的不同模式之间切换吗。?因为我不想在不同的数据源之间切换。