什么是在EJB中存储数据库连接数据的惯用方法?

时间:2014-01-29 10:49:29

标签: ejb

出于某些原因,我必须在我的数据源中使用应用程序管理的安全性。因此,每当我必须在数据库中执行某些操作时,我需要提供用户名和密码(我基本上调用getConnection(usr, pwd)以获取(如果usr / pwd是正确的)有效连接)。目前我的bean是无状态的,所以我让我的所有方法都有用户名和密码参数。

有没有一种好方法以某种方式存储这些所需信息,而不是将它们作为参数传递?我正在考虑为此目的使用有状态的本地EJB,但我不确定这是一个好主意。

以下是我项目中的界面示例:

@Remote
public interface ExampleBeanRemote {
    Emp getEmpData(String usr, String pwd, int empId);
    Dep getDepInfo(String usr, String pwd, String dep);

    // ...
    // etc

} // ExampleBeanRemote interface

我想知道的是 - 有没有办法避免将usr / pwd(以及可能的其他会话和/或上下文相关信息)传递给每个无状态bean方法?

编辑1 :如果人们不了解第一部分 - 我不知道将在数据库连接中使用的用户名和密码!系统的每个用户都有他/她自己的数据库用户名和密码。

2 个答案:

答案 0 :(得分:1)

我可以想到两种方式(正统方式)来做到这一点:

  1. 将凭据配置为ejb环境属性,然后您可以在需要它们的每个ejb中注入它们或通过ejbContext获取它们,check this

  2. 您可以在某些时候在JNDI中注册您的凭据,然后查找它们或从您需要它们的每个ejb注入它们,check this

  3. 修改

    好的,如果你只是在运行时知道凭证,那么以上都不适用,问题就会变得更有趣。这就是我要做的,

    我肯定会使用会话作用域上下文,不仅要避免烦人的user / pass参数传递,还要专门缓存db连接(池化数据源?)并避免每次用户需要时连接到db的开销在那里做点什么。

    我能想到的一种方法,如果你在一个网络环境中并且你的ejbs在与你的web应用程序相同的jvm中运行,那就是创建一个你自己的代理对象来保持对当前用户池数据源的引用一个静态的ThreadLocal变量,并在JNDI中注册该对象,以便每个ejb可以查找或注入它并获取对当前用户数据源的引用(存储在当前线程上下文中),当然你必须做所有胶合代码:

    1. 在应用程序启动时:创建代理对象并在JNDI上下文中注册它
    2. 在会话开始时:使用当前用户凭据创建数据源并将其与会话上下文关联(HTTPSession或会话范围的bean)
    3. 在请求开始时:从会话上下文中获取在2中创建的数据源并在JNDI代理中设置
    4. 请求端
    5. :从JNDI代理中删除数据源
    6. 在会话结束时:发布数据源
    7. 另一方面,如果你不在网络环境中它变得更加棘手,你必须通过一些商业方法在某个时候传递凭证并“模拟”会话上下文,使用某种方式跟踪它会话ID,您必须传递给业务方法,或者您只能使用有状态的ejbs,我不建议。

答案 1 :(得分:0)

我在我的项目中使用相同的东西,所以我们使用常见的java连接类,我们有登录详细信息,每个数据库连接都调用相同的java连接。