JavaEE更改SaaS应用程序的DB模式运行时

时间:2012-02-10 09:45:29

标签: postgresql java-ee jpa glassfish ejb-3.0

我正在使用 JavaEE 技术( JPA,EJB,.. )开发SaaS应用程序

对于多租户,我选择了“共享数据库,单独模式”方法并设计了数据库( PostgreSQL

基本上我需要做的是更改应用程序中用户会话的默认架构,以便用户可以从正确的架构中获取自己的数据

我的业务逻辑是使用 EJB(容器管理)实现的,而应用服务器是 glassfishv3 所以在我的EJB中,我只是像这样注入 EntityManager

@PersistenceContext(unitName="DBNAME")
private EntityManager em; 

将交易管理留给glassfish

我试图为注入DataSource的无状态EJB编写 @PostConstruct 回调 但 getClientInfo ()以某种方式返回null,所以我甚至看不到默认架构。我注入DataSource的原因是因为我认为我必须做一些低级别的东西来指定架构。

我知道如果我管理应用程序中的事务而不是将它们留给应用服务器,我可以轻松地通过EMF更改EntityManager值但我想保留容器管理的基础结构,只需在运行时更改某些值

有没有办法用 SessionContext 或其他任何方法做到这一点?

克服这个问题的最佳方法是什么?

提前致谢

1 个答案:

答案 0 :(得分:1)

根据定义,

@PostConstruct是错误的方式,因为它只是对bean的一个提示,它已被构造并且已经注入了它的依赖项。 Bean现在位于EJB池中,等待第一次服务调用。 然后它将连接到该呼叫的客户端信息。在该呼叫之后,客户端信息再次断开。

我认为任何类型的标准注入和标准容器管理持久性内容都不适用于您的情况,因为注入只完成一次(在EJB创建时),但是您的情况需要为每个服务调用/事务注入 _AND 您的注入将取决于输入数据 - 包含租户ID的客户端请求。

另外:我希望,由于该方法的维护和性能负担,您最多只有6个(左右)租户。我从未见过这种方法在野外工作