动态访问多个数据库?

时间:2009-07-02 08:49:05

标签: java jdbc jndi

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

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

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

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

这是一种更有活力的方式吗?

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

所以:

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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