【问题标题】:How to dynamically change database/catalog when using Spring JdbcTemplate使用 Spring JdbcTemplate 时如何动态更改数据库/目录
【发布时间】:2014-12-12 10:46:49
【问题描述】:

假设所有客户端数据都存储在其自己的数据库/目录中,并且所有此类数据库都存储在单个 RDBMS(客户端数据)中。主数据(例如客户端,...)保存在另一个 RDBMS(主数据)中。我们如何通过JdbcTemplate动态访问客户端数据RDBMS中的特定数据库?

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

我基本上需要 JDBC 的 Connection.setCatalog(String catalog) 之类的东西,但我在 Spring JdbcTemplate 中没有找到类似的东西。

【问题讨论】:

  • 也许您可以用DelegatingDataSource 包装数据源以在getConnection() 中调用setCatalog()
  • 嗯,可能某种包装器可能是解决方案。现在的问题是如何将相应的目录传播到这样的包装器。无论如何,好点。
  • 关于 jdbcTemplate 创建:new JdbcTemplate(new MyDelegatingDS(dataSource, "catalogName")); 类似的东西
  • 是的,当然,我的意思是在整个解决方案的上下文中,但它超出了问题本身的范围。无论如何,您不想将您的 cmets 总结为答案吗?我认为它值得被接受,因为目前可能没有比DataSource wrapper 更好的解决方案了。
  • 您使用的是哪个 DBMS?

标签: java mysql spring-data spring-jdbc jdbctemplate


【解决方案1】:

也许您可以用DelegatingDataSource 包装数据源以在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)); 

【讨论】:

    【解决方案2】:

    您可以从JdbcTemplate 访问Connection

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

    您只需确保数据库驱动程序支持此功能。

    【讨论】:

    • 是的,我可以使用这种方法,但我不想直接使用 JDBC(ConnectionStatementResultSet,...)。这样用JdbcTemplate是没用的。问题是我想使用JdbcTemplate的接口来访问数据。
    • @pgiecek:使用 JdbcTemplate 的目的是避免使用普通 JDBC 时需要的样板代码。如果使用纯 JDBC 的解决方案简单易行,那么为什么不使用它呢?没有比调用setCatalog() 更简单的了
    • 是的,我同意。我喜欢JdbcTemplate,因为正如您所指出的,它可以避免 JDBC 样板代码。而且只是因为一个微小的连接调整,我不想直接使用 JDBC。我认为@RC 的解决方案是一个很好的折衷方案。
    【解决方案3】:
    jdbcTemplate.getDataSource().getConnection().setSchema(schemaName) 
    

    这是我使用 postgres 切换架构所需要的。支持@m3th0dman 让我走上正轨。我只是添加这个,以防其他人发现这个答案像我一样搜索切换模式。

    【讨论】:

      猜你喜欢
      • 2011-12-19
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 2013-07-25
      • 2016-09-17
      • 2013-04-24
      • 1970-01-01
      相关资源
      最近更新 更多