【问题标题】:Dynamically access multiple databases?动态访问多个数据库?
【发布时间】:2009-07-02 08:49:05
【问题描述】:

我的问题与这个问题非常相关:Multiple dynamic data sources for a servlet context。但是我还没有找到合适的解决方案,想再问一次。

我有一个小型 JSF 应用程序,它通过 JDBC 与 MS SQL Server 通信。 Tomcat 用作 Web 容器。应用程序从单个数据库中检索和存储其数据。提供登录屏幕。如果凭据与存储在数据库中的凭据匹配,则授予访问权限,我可以使用该应用程序。

现在我想添加更多数据库并提供一个登录屏幕,它不仅要求用户名和密码,还要求数据库名称。使用不同的数据库是因为我想要一些用于测试和开发。每个数据库的备份计划也不相同。

目前我使用 JNDI 资源在我的代码中查找数据库。然而,这迫使我编辑 context.xml 和 web.xml 并重新启动 tomcat。我不想那样做。重启迫使我跑来跑去告诉所有人:“嘿,我正在重启,你介意失去所有连接吗?”

是否有更动态的方式来做到这一点?

【问题讨论】:

    标签: java jdbc jndi


    【解决方案1】:

    出于您的目的,您实际上应该拥有三个独立的应用程序服务器实例(在三台不同的机器上,或者在同一台机器上侦听不同的端口,或不同的主机头等)。开发服务器实例应始终查找开发数据库,​​登台服务器查找登台数据库等,并且应设置 JNDI 以反映这一点。这就是 JNDI 的用途。

    也就是说,如果您必须仅使用单个应用程序服务器进行设置,您可能需要考虑编写一个自定义的authentication realm 来执行此操作。您可以自行决定使用哪个数据源,也可以查看 Hibernate Shards 之类的内容。

    【讨论】:

      【解决方案2】:

      创建一个数据源数组,并让用户选择要使用该数组中的哪个索引。

      【讨论】:

      • 这是如何动态的?如果 DBA 创建了一个新的 DB,则索引不在 webapp 中。
      【解决方案3】:

      我不知道答案,但如果您从 JNI 致电 OSQL -L,您可以获得该地区可用 SQL 数据库实例的列表。然后您可以连接并获取其中的数据库列表。

      所以:

      1. 用户输入用户名和密码
      2. app 运行 OSQL -L 以获取实例列表并提供选择列表
      3. 用户选择实例,jdbc 在步骤 1 中使用凭据从实例中获取数据库列表
      4. jdbc 使用选定的数据库进行连接。

      【讨论】:

        【解决方案4】:

        您可以使用 select 语句获取 SQL Server 中的数据库,并最终丢弃其中一些与您的应用程序无关的数据库。

        ResultSet rs = stmt.executeQuery("show databases");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-26
          • 1970-01-01
          • 2023-03-20
          • 1970-01-01
          • 2013-11-11
          • 1970-01-01
          相关资源
          最近更新 更多