我正在使用 Hibernate 3.6.0 和 JBoss 6.0-Final 版本,我的数据库 MS-SQL Server 2008 。
我必须从LDAP服务器获取员工数据并将其插入数据库 - LDAP条目的数量为180,000或更多。
我正在使用 bean托管交易,因为使用 CMT 我的交易 从不 得到提交(因为插入的数量很大)
逻辑是:在一个while循环中,我一直在抓取&使用JPA(Hibernate)在数据库中创建条目。因此,作为无状态EJB api的一部分,我有一系列的fetch-create活动。 我在处理每20个记录后调用entityManager.flush()/ clear()和提交事务。
在插入40,000条记录后,我在JBoss Serevr.log中关注 WARN消息。
不确定它是否真的是警告或错误?
虽然我收到此错误,但服务器仍然运行并继续在DB中插入新记录。
有人可以建议我做错了什么吗?或者是什么导致了这个错误?
有没有办法增加EJB超时?
16:52:49,690 WARN [com.arjuna.ats.arjuna] ARJUNA-12117 TransactionReaper::check timeout for TX 0:ffff105966b8:126a:4db9fc0a:a4 in state RUN
16:52:49,691 WARN [com.arjuna.ats.arjuna] ARJUNA-12121 TransactionReaper::doCancellations worker Thread[Transaction Reaper Worker 0,5,jboss] successfully canceled TX 0:ffff105966b8:126a:4db9fc0a:a4
非常感谢任何帮助。
答案 0 :(得分:8)
This website总结了一些更改jboss事务超时的方法。例如,您可以在standalone.xml配置文件中将其指定为如下子系统:
<subsystem xmlns="urn:jboss:domain:transactions:3.0">
<core-environment>
<process-id><uuid/></process-id>
</core-environment>
<recovery-environment socket-binding="txn-recovery-environment" status-socket-binding="txn-status-manager"/>
<coordinator-environment default-timeout="<your timeout value here>"/>
</subsystem>
备选通过子系统下的jboss管理平台调整事务超时参数 - &gt;事务 - &gt;超时
也许这会有所帮助。
答案 1 :(得分:4)
根据你自己的评论(但是为了给出一个实际的例子),如果你需要增加一个事务超时,你可以在任何类定义你的事务边界的方法上使用注释(通常是“facade”implmentation)
例如,使用org.springframework.transaction.annotation.Transactional
@Transactional(timeout = 600) // value is in seconds
听起来你需要这个用于一次性数据转换任务而不是日常生产代码,因此增加超时可能是合理的。否则,值得考虑将处理批处理为较小的块,并使每个块都成为一个独特的事务,预计将在系统的默认超时时间内完成。