Java 如何在使用SpringJDBCTemplate时动态更改数据库/目录

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)这样的东西,但我在

考虑这样一种情况:所有客户机数据都存储在自己的数据库/目录中,而所有此类数据库都存储在单个RDBMS(客户机数据)中。主数据(如客户机等)保存在另一个RDBMS(主数据)中。如何通过
JdbcTemplate
动态访问客户机数据关系数据库中的特定数据库

在客户端数据RDBMS中为每个数据库定义
DataSource
,然后根据建议动态选择一个数据库,这对我们来说不是一个选项,因为数据库是动态创建和销毁的


我基本上需要像JDBC的
连接.setCatalog(String catalog)
这样的东西,但我在Spring
JdbcTemplate

中找不到类似的东西。您可以从
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)