[英]How to specific default schema for MySQL db in Spring Boot Jdbc
我们正在从Spring Boot连接到多个数据库。
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
数据库配置:
@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();
}
}
我们正在使用Spring Jdbc模板,即使我们已在应用程序属性中的url中定义了架构名称,我们也必须在每个查询中显式命名架构。 例如:没有架构名称的查询不起作用
select * from db_test_1.user //works with schema name
select * from user //doesn't work
按照这个答案,我应该使用Connection.setCatalog()
,如何在Spring配置中使用它?
通过使用委托数据源
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;
}
}
然后在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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.