【问题标题】:Dynamically configuring datasources动态配置数据源
【发布时间】:2011-03-29 13:28:39
【问题描述】:

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

用于访问SUMMARY表的服务器名称和数据库中的数据为此目的在一个表中参数化。这些数据取决于连接的数据库,这样:例如,如果我在 server1 的数据库 DB1 中,则参数将为 server21 和 DB21,而如果有人从 server1 引用 DB5 中的参数,则参数将为 server16和 DB16。

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

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

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

应用规范为:

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

在此先感谢任何了解该知识并愿意分享的人。

【问题讨论】:

    标签: java hibernate spring dynamic datasource


    【解决方案1】:

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

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

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

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

    您可以查看javadocsConnectionProvider 接口。自己实现,在你的 hibernate 配置文件中设置hibernate.connection.provider_class 属性指向你的类,你就完成了。

    【讨论】:

    • 如果你不想使用固定的数据源,你可以通过传统的方式获取一个普通的JDBC连接并在提供者中返回,只要你有连接参数。
    【解决方案2】:

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

    【讨论】:

    • hello jny:我不知道数据库/服务器组合的数量。使用频率低(仅当用户向SUMMARY表发出查询时,这种情况并不常见)。此应用程序服务器配置为使用数据源进行连接。我不允许更改它,此应用程序也配置为使用 hibernate.properties 来管理数据库连接,我也无法更改。感谢您的帮助。
    【解决方案3】:

    或扩展 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();
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 2018-10-09
      • 2017-06-04
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多