JBoss 4.x上的EJB 2.x事务隔离

时间:2015-08-14 13:53:21

标签: ejb-2.x jboss-4.2.x

我们有一个遗留应用程序,它运行在JBoss 3.x实例上,无法进行大型更改或重写。由于以下几个问题可能会出现以下问题,我将给出一个抽象的例子,所以如果您需要更多信息,请不要犹豫,我会尝试收集它。

主要问题如下:虽然应用程序在JBoss 3.x上运行良好,但我们希望将其迁移到JBoss 4.x,以便能够缓慢过渡到EJB 3.x或JPA等技术。我知道JBoss 4.x已经超过其生命周期,但不幸的是,这种情况无法解决(除了继续在3.x上运行)。

在我们的测试中,我们遇到的情况是,同一事务中的查询可以读取未提交的数据,而未提交的关系则不能。

这里有一些系统外观的抽象代码:

实体(XML是通过xdoclet创建的,出于简单原因我遗漏了。如果设置是必要的,我可以添加它们):

public abstract class Foo extends EntityBean, ...
{
  ...

  public abstract RelationshipLocal getRelationship(  );

  public abstract void setRelationship( RelationshipLocal relationshipEntity );


  public StammdatenAuthProcStepPK ejbCreate( RelationshipLocal relationshipEntity, ... )
     throws javax.ejb.CreateException
  {
    setComment( "some comment" );                
  }

  public void ejbPostCreate( RelationshipLocal relationshipEntity, ... )
    throws javax.ejb.CreateException
  {
    setRelationship( relationshipEntity );
  }
}

DAO方法:

public Long getRelationshipUid( ... )
{ 
  Connection conn = getDataSource().getConnection();
  Statement stmt = conn.createStatement();
  ResultSet rs = stmt.executeQuery( "SELECT relationshipUid FROM foo WHERE ...;" );

  if( rs.next() )
  {
    long relationshipUid = rs.getLong( "relationshipUid" );

    if( !rs.wasNull() ) //always false, i.e. relationshipUid is always null
    {
      return new Long (relationshipUid);
    }
  }

  return null;
}

据我了解该系统,我们有以下顺序:

  • 开始交易
  • 创建实体(调用ejbCreate()并发出INSERT)
  • 更新关系(调用ejbPostCreate()并发出UPDATE)
  • 使用上面的DAO方法从新创建的实体中选择关系uid
  • 用那个uid做什么(我不知道到底是什么)
  • 提交交易

由于我们在ejbCreate()中设置字段,似乎事务隔离级别设置为read uncommitted,但是我不知道在EJB 2.x中检查它的位置。

在EJB 3.x中,我首先使用EntityManager.refresh(),并且可能首先使用手册flush(),但是因为EJB 2.x没有一个不会出现的实体管理器。 ;似乎是一种选择。

我们尝试更改standardjboss.xml中的容器设置,例如<commit-option>但没有任何成功。

我们可以照顾什么或者可能出现什么问题?

任何全球选项(例如JBoss设置,无需更改代码,因为我们不了解所有地方)将受到欢迎。

1 个答案:

答案 0 :(得分:1)

我们最近从JBOSS 4迁移到了EAP 6.但是在我们的JBOSS 4配置中,我们在容器配置(standardjboss.xml)中有以下设置:

<container-configuration>
     <container-name>Standard CMP 2.x EntityBean post create</container-name>
     <call-logging>false</call-logging>
     <invoker-proxy-binding-name>entity-rmi-invoker</invoker-proxy-binding-name>
     <sync-on-commit-only>false</sync-on-commit-only>
     <insert-after-ejb-post-create>true</insert-after-ejb-post-create>
...
<container-configuration>

将设置&#34;在ejb-post-create后插入&#34; 更改为 true 将确保正确无误数据库交互,以便您的数据在同一事务中可用于读取。