动态配置数据源

时间:2011-03-29 13:28:39

标签: java hibernate spring dynamic datasource

情况是这样的:在查询中使用的表(将其命名为SUMMARY)以前在同一服务器和数据库中,我正在执行应用程序的所有查询(将其命名为server1和DB1)。但最近从此数据库中删除了SUMMARY表,这使得有必要参考其他服务器/数据库组合。

出于此目的,在表中参数化来自服务器名称和用于访问SUMMARY表的数据库中的数据。这些数据取决于连接的数据库,这种方式:例如,如果我在server1的数据库DB1中,那么参数将是server21和DB21,而如果有人从server1引用DB5中的参数参数将是server16和DB16。

在那方面我没有问题,因为我列出了两个参数的SQL查询,准备在每种情况下给出服务器和数据库的名称。此查询是必需的,以便为服务器名称和数据库名称提供动态生成要连接的数据源。

问题和这个条目的主题是,是否有人必须动态配置要在hibernate.properties中使用的数据源,因为这通常是单个固定值,在这种情况下应该允许更改要查看SUMMARY表(使用我的SQL查询检索的参数)仅在此特定情况下,而所有其他数据库操作必须使用原始连接属性执行。

那就是:我需要的是根据来自查询的参数动态生成数据源,所以通过事先知道 来处理这个数据的方法连接应该丢弃,因为它们无法解决我的问题。

应用程序规范是:

  • 数据库引擎:SQL Server 2005
  • PROG。语言:Java 5.0
  • 框架:Spring 2.0.4,Hibernate 3.0.5
  • 应用。服务器:WAS 6.1

提前感谢任何拥有这些知识且愿意分享的人。

3 个答案:

答案 0 :(得分:1)

您可以在休眠中使用ConnectionProvider来决定如何使会话使用连接。我们在我们的应用程序中使用这样的东西:

    public Connection getConnection() throws SQLException {
        DataSource ds = (DataSource) BeanFactory.getBean("dataSource" + UserInfo.getDSName());
        return ds.getConnection();
}

UserInfo是一个在ThreadLocal中存储东西的类。此代码将根据ThreadLocal中传递的名称从Spring中选择数据源。我们所做的是在打开会话之前设置我们想要使用的数据源的名称(实际逻辑比这更复杂,因为它取决于用户偏好和其他东西)。

您可以执行类似的操作来选择要连接的数据库。

您可以查看ConnectionProvider界面的javadocs。制作您自己的实现,在您的hibernate配置文件中设置hibernate.connection.provider_class属性以指向您的类,然后就完成了。

答案 1 :(得分:0)

我想,这取决于数据库/服务器组合的数量和使用它们的频率,但如果有很多数据库/服务器和低使用频率,使用没有Hibernate的普通JDBC和数据源可能是一个选项。我认为Hibernate并不适合这种情况。

答案 2 :(得分:0)

或扩展org.apache.commons.dbcp.BasicDataSource

public class MyDataSource extends BasicDataSource {
private void init() {
    username = ...
    password = ...
    url = ...
}

@Override
protected synchronized DataSource createDataSource() throws SQLException {
    init();
    return super.createDataSource();
}
}
相关问题