我们有一个运行在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将确保正确的数据库交互,以便在同一事务期间读取您的数据。