【问题标题】:How to map users to different data sources如何将用户映射到不同的数据源
【发布时间】:2013-08-29 13:00:21
【问题描述】:

我在 Single Application Server (Jboss 4.2.3) 中有 2 个数据源的 JNDI 设置。

如何识别哪个用户请求命中来自哪个数据库连接?如何根据用户请求设置 Db 连接。我需要为用户提供一次数据库连接。 即我想在我的应用程序中使用动态数据源。我使用的是纯 JDBC 连接

【问题讨论】:

  • 请澄清一下,有两三个问题(简化为一个)。顺便说一句,哪个数据库?
  • 我有一个应用服务器(JBoss),在其中,我定义了 2 个数据源(两者都指向 oracle DB),我的问题是,我们如何识别(应用服务器指向哪个 db 应该使用)

标签: jakarta-ee jdbc jboss jndi


【解决方案1】:

您正在构建一个多租户应用程序。

  • 因此,您需要在用户和数据源之间建立另一个映射(例如在 DB 表中)。根据该映射选择数据源。

  • 用户应该对您的应用程序进行身份验证,因此您可以调用request.getRemoteUser()。使用它在映射表中查找数据源名称。

  • 现在您有了数据源的名称。数据源绑定在 JNDI 中,每个数据源都有一个唯一的名称。

在您的应用程序中,您可以通过名称查找数据源:

final DataSource ds = (DataSource) ic.lookup("java:/jdbc/x1");
final Connection conn = ds.getConnection();
try {
  // Do something with connection
} finally {
  conn.close();
}

所以在您的情况下,您有两个名称,例如 java:/jdbc/x1java:/jdbc/x2

您在定义数据源的同一位置定义 JNDI 名称。

【讨论】:

  • 感谢 Beryllium,我想知道,是否有任何技术可以在用户请求中传递数据源名称(Java:/jdbc/x1 或 java:/jdbc/x2)??
  • 是的,这已经在示例中:只需将请求中的字符串参数传递给lookup() 方法。技术上可行,但请检查您没有打开任何安全漏洞。
  • 以我的场景为例,用户 A 使用 x1 数据源,用户 B 使用 x2 数据源,每当用户 A 登录应用程序时,我的应用程序中需要 x1 数据源名称,我们不知道哪个用户可以一次访问应用程序..
  • 要么将用户名也作为请求参数传递(再次:检查安全漏洞),要么让用户在之前进行身份验证;在这种情况下,您可以致电request.getRemoteUser()
  • 实际上我的两个数据库中有数千个用户。一些 A 公司,一些 B 公司,我的两个客户的应用程序相同,但 DB 不同。所以只想使用 DataSource 技术来处理具有两个 DB 数据源的 1 个应用程序服务器。如果你有任何其他方法,请分享。
猜你喜欢
  • 2012-03-10
  • 1970-01-01
  • 2014-02-23
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多