gpt4 book ai didi

java - Java EE 数据源上连接的上下文特定用户名 (JBoss 5.1)

转载 作者:太空宇宙 更新时间:2023-11-04 08:50:27 26 4
gpt4 key购买 nike

我们有一个应用程序需要访问另一个团队拥有的数据库。该数据库在数据库内部具有安全性(触发器、表权限等),因此我们需要使用连接到 EJB 的相同用户名/密码来建立到数据库的连接。

我们正在 JBoss 5.1 上运行。标准 Java EE 解决方案是首选,但 JBoss 特定答案也可以。

目前我们的解决方案是

  • 在 JBoss 中创建一个没有用户 ID 密码的数据源
  • 要求客户端将其用户名/密码传递到 EJB(EJB 是有状态 session Bean (SFSB),并记住用户名/密码)
  • session Bean 使用 DataSource.getConnection(String, String) 创建新连接
  • 连接是在每个请求开始时从数据源“创建”的(数据源实现可能重用现有连接)

我们面临的主要问题是连接池。JBoss 连接池不会为每个用户名管理单独的池 - 它们都被放入 1 个大池中,并在从池中检索对象后检查用户名(在 InternalManagedConnectionPool 内)。如果用户名不匹配,则连接将从池中删除并销毁。这意味着一旦我们有 2 个用户,放入池中的任何连接在下次访问时就有 50% 的可能性将被销毁。随着用户数量的增加,这种可能性会变得更糟。

我们不能简单地在 SFSB 中创建 1 个连接并保留它,因为 JBoss 对我们来说太聪明了,它检测到我们打开了一个连接并自动将其返回到池中,因此对 SFSB 的下一个请求将因“未关联”连接而失败。

如果我们可以简单地让 JBoss 作为“当前登录的用户”创建连接,那就太好了,但我们的解决方案是可以忍受的。

我的谷歌搜索未能找到任何推荐的执行此类操作的模式。每个人似乎都假设您希望数据源对所有连接使用单个用户(如果可能的话,这很好,但在这种情况下我不能这样做)

我能想到的唯一解决方案是

  1. 不要使用容器提供的数据源。将 JDBC URL 放入某处的配置值中并自己创建连接(可能在 spring 的帮助下)
  2. 将不同的数据源实现(可能是自定义的)绑定(bind)到 JNDI

有没有人有更好的解决方案?或者指向该领域的推荐实践?

(数据库是 Sybase ASE 15,但我怀疑这对解决方案有任何影响)

最佳答案

多读一点文档让我找到了解决方案。添加 <application-managed-security/>到我的数据源文件中似乎已经解决了连接池的问题。

我不知道我第一次是怎么错过的。

关于java - Java EE 数据源上连接的上下文特定用户名 (JBoss 5.1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3464242/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com