Java 如何在使用SpringJDBCTemplate时动态更改数据库/目录
考虑这样一种情况:所有客户机数据都存储在自己的数据库/目录中,而所有此类数据库都存储在单个RDBMS(客户机数据)中。主数据(如客户机等)保存在另一个RDBMS(主数据)中。如何通过Java 如何在使用SpringJDBCTemplate时动态更改数据库/目录,java,mysql,spring-data,spring-jdbc,jdbctemplate,Java,Mysql,Spring Data,Spring Jdbc,Jdbctemplate,考虑这样一种情况:所有客户机数据都存储在自己的数据库/目录中,而所有此类数据库都存储在单个RDBMS(客户机数据)中。主数据(如客户机等)保存在另一个RDBMS(主数据)中。如何通过JdbcTemplate动态访问客户机数据关系数据库中的特定数据库 在客户端数据RDBMS中为每个数据库定义DataSource,然后根据建议动态选择一个数据库,这对我们来说不是一个选项,因为数据库是动态创建和销毁的 我基本上需要像JDBC的连接.setCatalog(String catalog)这样的东西,但我在
JdbcTemplate
动态访问客户机数据关系数据库中的特定数据库
在客户端数据RDBMS中为每个数据库定义DataSource
,然后根据建议动态选择一个数据库,这对我们来说不是一个选项,因为数据库是动态创建和销毁的
我基本上需要像JDBC的
连接.setCatalog(String catalog)
这样的东西,但我在SpringJdbcTemplate
中找不到类似的东西。您可以从JdbcTemplate
访问连接:
jdbcTemplate.getDataSource().getConnection().setCatalog(catalogName)代码>
您只需确保数据库驱动程序支持此功能。也许您可以使用包装数据源,在getConnection()
中调用setCatalog()
,并在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));
这是我使用postgres切换模式所需要的。@m3th0dman的道具,让我走上正轨。我只是在其他人像我一样搜索切换模式时才添加此选项。也许您可以使用DelegatingDataSource
包装数据源,以便在getConnection()
中调用setCatalog()
。嗯,可能某种包装器就是解决方案。现在的问题是如何将各自的目录传播到这样一个包装器。无论如何,这是一个很好的观点。关于jdbcTemplate的创建:newjdbctemplate(newmydelegatingds(dataSource,“catalogName”)是的,当然,我的意思是在整个解决方案的上下文中,但它超出了问题本身的范围。不管怎样,你不想总结一下你的评论作为答案吗?我认为它值得接受,因为目前可能没有比数据源
包装器更好的解决方案。您使用的是哪种DBMS?是的,我可以使用这种方法,但我不想直接使用JDBC(连接
,语句
,结果集
,…)。这样使用JdbcTemplate
是没有用的。问题是我想使用JdbcTemplate
的接口来访问数据。@pgiecek:使用JdbcTemplate的目的是避免使用普通JDBC时需要的锅炉板代码。如果一个解决方案使用普通JDBC既简单又容易,那么为什么不使用它呢?调用setCatalog()
是的,我同意。我喜欢JdbcTemplate
,因为正如您所指出的,它可以避免使用JDBC锅炉板代码。仅仅因为一个小小的连接调整,我不想直接使用JDBC。我认为@RC的解决方案是一个很好的折衷方案。
jdbcTemplate.getDataSource().getConnection().setSchema(schemaName)