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



我们有一个运行在JBoss 3上的遗留应用程序。X实例,不能大规模地更改或重写。由于下面的问题可能会在几个地方发生,我将给出一个有点抽象的例子,所以如果你需要更多的信息,请不要犹豫,我会尽力收集。

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

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

下面是一些系统的抽象代码:

实体(XML)是通过xdoclet创建的,为了简单起见我省略了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;
}

根据我对系统的理解,我们有以下顺序:

    <
  • 开始事务/gh>
  • 创建实体(ejbCreate()被调用并发出INSERT)
  • 更新关系(ejbPostCreate()被调用并发出update)
  • 使用上面的DAO方法从新创建的实体中选择关系uid
  • 用uid做点什么(我不知道到底是什么)
  • <
  • 提交事务/gh>

由于我们在ejbCreate()中设置了字段,似乎事务隔离级别被设置为读取未提交,但是我不知道在EJB 2.x中该在哪里检查。

在EJB 3中。x我会使用EntityManager.refresh(),也许首先是手动flush(),但由于EJB 2。x没有一个EntityManager,这似乎不是一个选项。

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

还有其他的想法吗,我们可以注意什么,或者什么地方会出错?

任何全局选项(例如JBoss设置,不需要更改代码,因为我们不知道所有的位置)都是受欢迎的。

我们最近从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>

"insert-after-ejb-post-create"设置更改为true将确保正确的数据库交互,以便在同一事务期间读取您的数据。

相关内容

  • 没有找到相关文章

最新更新