我正在使用Hibernate 3.6.0与JBoss 6.0-Final发布,我的数据库是MS-SQL Server 2008。我必须从LDAP服务器获取员工数据并将其插入数据库- LDAP条目的计数为180,000或更多。我使用bean管理的事务,因为使用CMT我的事务永远不会被提交(因为插入的大容量)。
逻辑是:在while-loop中,我一直在抓取&使用JPA (Hibernate)在数据库中创建条目。因此,作为无状态EJB api的一部分,我有一长串的获取-创建活动。我调用entityManager.flush()/clear()和提交事务后处理每20记录。
我得到以下警告消息在JBoss服务器.log后,我已经插入了40,000条记录。不确定这是警告还是错误?
虽然我得到这个错误,服务器仍然运行并继续在数据库中插入新记录。
谁能建议如果我做错了什么?或者是什么导致了这个错误?
是否有办法增加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
本网站总结了另外两种更改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管理平台调整事务超时参数->transaction->Time Out
也许会有帮助。
根据您自己的注释(但要给出一个实际的例子),如果您需要增加事务超时,您可以在定义事务边界的任何类的方法上使用注释(通常是"facade"实现)。
例如,使用org.springframework.transaction.annotation.Transactional
@Transactional(timeout = 600) // value is in seconds
听起来您需要一次性的数据转换任务,而不是日常的生产代码,所以增加超时可能是合理的。否则,值得考虑将处理批处理成更小的块,并使每个块成为唯一的事务,预计将在系统的默认超时内完成。