0

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

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

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

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

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

4

4 回答 4

0

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

于 2009-07-02T09:56:03.207 回答
0

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

所以:

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

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

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

于 2009-07-02T19:05:07.880 回答
0

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

ResultSet rs = stmt.executeQuery("show databases");
于 2009-07-02T19:12:02.450 回答