考虑一种情况,其中所有客户端数据都存储在其自己的数据库/目录中,并且所有此类数据库都存储在单个RDBMS(客户端数据)中。主数据(例如客户端,......)保存在另一个RDBMS(主数据)中。我们如何通过JdbcTemplate
?
为客户端数据RDBMS中的每个数据库定义DataSource
,然后根据建议动态选择一个here对我们来说不是一个选项,因为数据库是动态创建和销毁的。
我基本上需要像JDBC Connection.setCatalog(String catalog)
这样的东西,但我没有在Spring JdbcTemplate
中找到类似的东西。
答案 0 :(得分:4)
也许你可以用DelegatingDataSource
包装数据源来调用setCatalog()
中的getConnection()
并使用JdbcTemplate
创建的包装数据源:
class MyDelegatingDS extends DelegatingDataSource {
private final String catalogName;
public MyDelegatingDS(final String catalogName, final DataSource dataSource) {
super(dataSource);
this.catalogName = catalogName;
}
@Override
public Connection getConnection() throws SQLException {
final Connection cnx = super.getConnection();
cnx.setCatalog(this.catalogName);
return cnx;
}
// maybe also override the other getConnection();
}
// then use like that: new JdbcTemplate(new MyDelegatingDS("catalogName", dataSource));
答案 1 :(得分:3)
您可以从Connection
:
JdbcTemplate
jdbcTemplate.getDataSource().getConnection().setCatalog(catalogName);
您只需确保数据库驱动程序支持此功能。
答案 2 :(得分:0)
jdbcTemplate.getDataSource().getConnection().setSchema(schemaName)
是使用postgres切换架构所需要的。推荐给@ m3th0dman让我走上正轨。我只是添加了这个,以防其他人发现这个答案正在寻找切换架构。