使用 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(Connection
,Statement
,ResultSet
,...)。这样用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 -- Spring JdbcTemplate基本使用
spring学习spring的jdbcTemplate(增删改查封装)