使用 Spring JdbcTemplate 时如何动态更改数据库/目录

Posted

技术标签:

【中文标题】使用 Spring JdbcTemplate 时如何动态更改数据库/目录【英文标题】:How to dynamically change database/catalog when using 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? 【参考方案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 让我走上正轨。我只是添加这个,以防其他人发现这个答案像我一样搜索切换模式。

【讨论】:

以上是关于使用 Spring JdbcTemplate 时如何动态更改数据库/目录的主要内容,如果未能解决你的问题,请参考以下文章

Spring之004: jdbcTemplate基本使用Spring实物控制

Spring--JdbcTemplate

Spring -- Spring JdbcTemplate基本使用

spring学习spring的jdbcTemplate(增删改查封装)

使用Webflux和Spring Cloud时如何用netty替换tomcat?

Spring JdbcTemplate详解