我们有一个遗留应用程序,它运行在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)由于我们在ejbCreate()
中设置字段,似乎事务隔离级别设置为read uncommitted,但是我不知道在EJB 2.x中检查它的位置。
在EJB 3.x中,我首先使用EntityManager.refresh()
,并且可能首先使用手册flush()
,但是因为EJB 2.x没有一个不会出现的实体管理器。 ;似乎是一种选择。
我们尝试更改standardjboss.xml中的容器设置,例如<commit-option>
但没有任何成功。
我们可以照顾什么或者可能出现什么问题?
任何全球选项(例如JBoss设置,无需更改代码,因为我们不了解所有地方)将受到欢迎。
答案 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 将确保正确无误数据库交互,以便您的数据在同一事务中可用于读取。