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

时间:2010-08-12 02:01:06

标签: java jboss datasource

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

我们正在运行JBoss 5.1。标准的Java EE解决方案是首选,但JBoss会有特定的答案。

目前我们的解决方案是

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

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

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

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

我的谷歌搜索未能找到任何推荐的模式来做这种事情。每个人似乎都认为你希望你的数据源为所有连接使用单个用户(这在可能的情况下很好,但在这种情况下我不能这样做)

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

  1. 不要使用容器提供的数据源。将JDBC URL放在某处的配置值中并自己创建连接(可能在spring的帮助下)
  2. 将不同的Datasource实现(可能是自定义实现)绑定到JNDI
  3. 有没有人有更好的解决方案?或指向该领域的推荐做法?

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

1 个答案:

答案 0 :(得分:1)

对文档的更多阅读使我看起来似乎是解决方案。 添加     <application-managed-security/> 进入我的数据源文件似乎已经修复了连接池的问题。

我不确定我第一次错过了这个。