0

项目由EJB 2.0EJB 3.0 Beans 组成。我将会话 bean 从 EJB 2.0 转换EJB 3.0,当我启动项目时,它多次初始化会话 bean。会话 bean 调用其他会话 bean,后者又调用此会话 bean 的不同方法。只要是 EJB 2.0 会话 bean,就只初始化了一个实例,但现在初始化了多个实例。

UtilitiesController Session Bean 启动一个线程,该线程调用Miscellaneous Class(Helper Class POJO),后者调用ProductScheme Session Bean,后者调用ServerGlobalValues(Helper Class POJO)并调用UtilitiesController Session Bean

以下是日志:

setSessionContext 调用了!
setSessionContext 调用了!
@PostConstruct 方法已调用!
开始初始化
<2013-06-07 15:03:53.535--ServerSession(316201757)--EclipseLink,版本:Eclipse Persistence Services - 2.1.3.v20110304-r9073>
<2013-06-07 15:03:53.535-- ServerSession(316201757)--Server: 10.3.5.0>
setSessionContext Called!
setSessionContext 调用了!
@PostConstruct 方法已调用!
开始初始化
<2013-06-07 15:03:53.691--ServerSession(316201757)--DatabaseSession 有一个由 ServerPlatform 以外的东西定义的外部事务控制器。EclipseLink 将允许覆盖外部事务控制器,但我们建议您考虑子类化 org.eclipse.persistence.platform.server.ServerPlatformBase 并覆盖 getExternalTransactionControllerClass()。>
<2013-06-07 15:03:53.691- -ServerSession(316201757)--EclipseLink,版本:Eclipse Persistence Services - 2.1.3.v20110304-r9073>
<2013-06-07 15:03:53.691--ServerSession(316201757)--Server: 10.3.5.0>
setSessionContext Called !
setSessionContext 调用了!
@PostConstruct 方法已调用!
开始初始化
<2013-06-07 15:03:53.722--ServerSession(316201757)--DatabaseSession 有一个由 ServerPlatform 以外的东西定义的外部事务控制器。EclipseLink 将允许覆盖外部事务控制器,但我们建议您考虑子类化 org.eclipse.persistence.platform.server.ServerPlatformBase 并覆盖 getExternalTransactionControllerClass()。>
<2013-06-07 15:03:53.722- -ServerSession(316201757)--EclipseLink,版本:Eclipse Persistence Services - 2.1.3.v20110304-r9073>
<2013-06-07 15:03:53.722--ServerSession(316201757)--Server: 10.3.5.0>
setSessionContext Called !
setSessionContext 调用了!
@PostConstruct 方法已调用!
开始初始化
<2013-06-07 15:03:53.847--ServerSession(316201757)--DatabaseSession 有一个由 ServerPlatform 以外的东西定义的外部事务控制器。EclipseLink 将允许覆盖外部事务控制器,但我们建议您考虑替代子类化 org.eclipse.persistence.platform.server.ServerPlatformBase 并覆盖 getExternalTransactionControllerClass()。>
<2013-06-07 15:03:53.847- -ServerSession(316201757)--EclipseLink,版本:Eclipse Persistence Services - 2.1.3.v20110304-r9073>
<2013-06-07 15:03:53.847--ServerSession(316201757)--Server: 10.3.5.0>
setSessionContext Called !
setSessionContext 调用了!
@PostConstruct 方法已调用!
开始初始化
<2013-06-07 15:03:53.879--ServerSession(316201757)--DatabaseSession 有一个由 ServerPlatform 以外的东西定义的外部事务控制器。EclipseLink 将允许覆盖外部事务控制器,但我们建议您考虑子类化 org.eclipse.persistence.platform.server.ServerPlatformBase 并覆盖 getExternalTransactionControllerClass()。>
<2013-06-07 15:03:53.879- -ServerSession(316201757)--EclipseLink,版本:Eclipse Persistence Services - 2.1.3.v20110304-r9073>
<2013-06-07 15:03:53.879--ServerSession(316201757)--Server: 10.3.5.0>
javax.ejb.EJBTransactionRolledbackException:EJB 异常:;嵌套异常是:异常 [EclipseLink-8030] (Eclipse Persistence Services - 2.1.3.v20110304-r9073): org.eclipse.persistence.exceptions.JPQLException

从日志中可以看出,每次创建实例都会调用两次setSessionContext,并且在初始化之前也会调用@PostConstruct方法。

谁能指出这种行为背后的原因。是否缺少任何配置?

4

1 回答 1

0

我忘了提到辅助类(即 Miscellaneous Class 和 ServerGlobalValues)是单例的,单例类的行为是出乎意料的。我发现多个实例的原因与调用辅助类的 getInstance() 有关。如果我在 PostConstruct 中调用 getInstance(),我会看到辅助类和控制器的多个实例,但将其移至类级别可以解决多实例问题。

于 2013-06-10T09:01:21.373 回答