在Weblogic 9的平台上有一个很显著的功能就是Application Level的资源,其中也包括JDBC的Datasource。所以客户的应用程序可以拥有自己的数据源,而且在同一台服务器上,不同的应用程序可以拥有相对独立的数据源。
在我们从Weblogic 9.1往Weblogic 10做产品升迁的过程中碰到了JPA无法使用Application Level资源的问题。其表现为无法初始化EntityManagerFactory,以下是我对这一问题的分析。
首先看JPA,作为JavaEE5的重要组成部分,它是一个基于POJO的O/R映射解决方案。根据JavaEE的规范,JPA是既可以在容器外面也可以在里面使用的。从此推断出,JPA与容器是一种比较松散的耦合结构,仔细研究JPA的规范,不难发现JPA与容器的数据源之间是通过JNDI的查找来完成的。
来看看BEA的应用程序部署的一个简要的步骤:
- 为部署准备Application Level的资源。
- 为部属准备Application。
- 部署到目标服务器。
所以在第三步之前,是无法使用Application Level的资源的,而在第二步的时候JPA的EntityManagerFactory将要被初始化完成。所以在第二步的时候会产生部署错误,而导致部署的回滚。
我个人认为这是一个Weblogic Server 10的一个错误,但不大好解决,除非专门为JPA作特殊的初始化步骤。在第三步完成后初始化EMF,一旦这样,有可能会违背Weblogic部署的标准流程,因为JPA的部署错误应该导致整个应用程序部署的回滚,但此时部署已经基本完成。
注:因为Weblogic在应用程序部署的时候是有几个状态变化的,具体可以参照Weblogic Deployment Document:
http://edocs.bea.com/wls/docs100/deployment/
关于上面的问题,我们只能把Application Level的Datasource降格到System Level来使用,务必会产生一些不良的影响和干扰,但没有很好的解决方案。
* : 如有读者有更好的方法解决,请不吝赐教。