2017-09-26 8 views
0

Springブートから複数のデータベースに接続しています。SpringブートJdbcのMySQLデータベースの特定のデフォルトスキーマへの方法

application.properties:

datasource.target.url=jdbc:mysql://localhost:3306/db_test_1?useSSL=false 
datasource.target.driver-class-name=com.mysql.jdbc.Driver 

datasource.origin.url=jdbc:mysql://localhost:3306/db_test_2?useSSL=false 
datasource.origin.driver-class-name=com.mysql.jdbc.Driver 

データベース設定:私たちは春の対応のJDBCテンプレートを使用していると我々はスキーマ名を定義しているにもかかわらず、我々は明示的に各クエリのスキーマに名前を付ける必要があり

@Configuration 
public class DatabaseConfig { 

    @Bean(name = "originJdbcTemplate") 
    public JdbcTemplate originJdbcTemplate() { 
     return new JdbcTemplate(originDataSource()); 
    } 

    @Bean(name = "targetJdbcTemplate") 
    public JdbcTemplate targetJdbcTemplate() { 
     return new JdbcTemplate(targetDataSource()); 
    } 

    @Bean 
    @Primary 
    @ConfigurationProperties("datasource.origin") 
    public DataSourceProperties originDataSourceProperties() { 
     return new DataSourceProperties(); 
    } 

    @Bean 
    @Primary 
    @ConfigurationProperties("datasource.origin") 
    public DataSource originDataSource() { 
     return originDataSourceProperties().initializeDataSourceBuilder().build(); 
    } 

    @Bean 
    @ConfigurationProperties("datasource.target") 
    public DataSourceProperties targetDataSourceProperties() { 
     return new DataSourceProperties(); 
    } 

    @Bean 
    @ConfigurationProperties("datasource.target") 
    public DataSource targetDataSource() { 
     return targetDataSourceProperties().initializeDataSourceBuilder().build(); 
    } 

} 

アプリケーションのプロパティで上記のURLにあります。 例えば: スキーマ名なしの問い合わせは、私はそれがSpring構成でどのように行うのか、私はConnection.setCatalog()使用する必要があります。このSO Answer あたりとして

select * from db_test_1.user //works with schema name 
select * from user //doesn't work 

動作しませんか?委任データソース

class DefaultSchemaDelegatingDS extends DelegatingDataSource { 
    private final String catalogName; 

    public DefaultSchemaDelegatingDS(final String catalogName, final DataSource dataSource) { 
     super(dataSource); 
     this.catalogName = catalogName; 
    } 

    @Override 
    public Connection getConnection() throws SQLException { 
     final Connection connection = super.getConnection(); 
     connection.setCatalog(this.catalogName); 
     return connection; 
    } 
} 

を使用することにより

答えて

0

、次いでDatabaseConfig

@Configuration 
public class DatabaseConfig { 

    @Value("${datasource.target.default_schema}") 
    private String defaultTargetSchema; 

    @Value("${datasource.origin.default_schema}") 
    private String defaultOriginSchema; 

    @Bean(name = "originJdbcTemplate") 
    public JdbcTemplate originJdbcTemplate() { 
     return new JdbcTemplate(originDataSource()); 
    } 

    @Bean(name = "targetJdbcTemplate") 
    public JdbcTemplate targetJdbcTemplate() { 
     return new JdbcTemplate(targetDataSource()); 
    } 

    @Bean 
    @Primary 
    @ConfigurationProperties("datasource.origin") 
    public DataSourceProperties originDataSourceProperties() { 
     return new DataSourceProperties(); 
    } 

    @Bean 
    @Primary 
    @ConfigurationProperties("datasource.origin") 
    public DataSource originDataSource() { 
     final DataSource ds = originDataSourceProperties().initializeDataSourceBuilder().build(); 
     return new DefaultSchemaDelegatingDS(defaultOriginSchema, ds); 
    } 

    @Bean 
    @ConfigurationProperties("datasource.target") 
    public DataSourceProperties targetDataSourceProperties() { 
     return new DataSourceProperties(); 
    } 

    @Bean 
    @ConfigurationProperties("datasource.target") 
    public DataSource targetDataSource() { 
     final DataSource ds = targetDataSourceProperties().initializeDataSourceBuilder().build(); 
     return new DefaultSchemaDelegatingDS(defaultTargetSchema, ds); 
    } 
} 

にDelegatingDatasourceを使用せずに他の方法は、単に

jdbcTemplate.getDataSource().getConnection().setCatalog(catalogName); 

例えば、

を追加しました
@Bean(name = "originJdbcTemplate") 
public JdbcTemplate originJdbcTemplate() throws SQLException { 
    JdbcTemplate jdbcTemplate = new JdbcTemplate(originDataSource()); 
    jdbcTemplate.getDataSource().getConnection().setCatalog(defaultOriginSchema); 
    return jdbcTemplate; 
} 
関連する問題