Java Jboss 7.2根记录器级别的调试在执行jpa查询时引发ConcurrentModificationException
环境:Java Jboss 7.2根记录器级别的调试在执行jpa查询时引发ConcurrentModificationException,java,hibernate,logging,jboss7.x,concurrentmodification,Java,Hibernate,Logging,Jboss7.x,Concurrentmodification,环境: JBoss7.2 爪哇11 冬眠5.3.15.1决赛 从无状态ejb中的方法执行jpa查询时,我收到一个错误ConcurrentModificationException。它一直工作到现在,不知道它可能是什么。查询仅获取条件中的记录 错误日志 13:06:24,419 ERROR [es.caib.accfor.presentation.back.security.UserPrincipalManager] (default task-1) Error UserPrincipalMa
- JBoss7.2
- 爪哇11
- 冬眠5.3.15.1决赛
13:06:24,419 ERROR [es.caib.accfor.presentation.back.security.UserPrincipalManager] (default task-1) Error UserPrincipalManager.doFilter: es.caib.accfor.business.AppException: Exception UsuarioService.trace
at deployment.accfor2.ear.accfor-ejb.jar//es.caib.accfor.business.security.boundary.UsuariService.trace(UsuariService.java:254)
...
Suppressed: javax.ejb.EJBTransactionRolledbackException: javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction.
at org.jboss.as.ejb3@7.2.0.GA-redhat-00005//org.jboss.as.ejb3.tx.CMTTxInterceptor.endTransaction(CMTTxInterceptor.java:114)
at org.jboss.as.ejb3@7.2.0.GA-redhat-00005//org.jboss.as.ejb3.tx.CMTTxInterceptor.endTransaction(CMTTxInterceptor.java:122)
at org.jboss.as.ejb3@7.2.0.GA-redhat-00005//org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:256)
... 106 more
Caused by: javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction.
at org.jboss.jts//com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1300)
at org.jboss.jts//com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:126)
at org.jboss.jts.integration//com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:89)
at org.wildfly.transaction.client@1.1.2.Final-redhat-1//org.wildfly.transaction.client.LocalTransaction.commitAndDissociate(LocalTransaction.java:77)
at org.wildfly.transaction.client@1.1.2.Final-redhat-1//org.wildfly.transaction.client.ContextTransactionManager.commit(ContextTransactionManager.java:71)
at org.jboss.as.ejb3@7.2.0.GA-redhat-00005//org.jboss.as.ejb3.tx.CMTTxInterceptor.endTransaction(CMTTxInterceptor.java:88)
... 108 more
Suppressed: javax.transaction.RollbackException: WFTXN0061: Transaction is marked rollback-only
...
Suppressed: javax.transaction.RollbackException: WFTXN0061: Transaction is marked rollback-only
...
Caused by: java.util.ConcurrentModificationException
at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1493)
at java.base/java.util.HashMap$EntryIterator.next(HashMap.java:1526)
at java.base/java.util.HashMap$EntryIterator.next(HashMap.java:1524)
at org.hibernate@5.3.7.Final-redhat-00001//org.hibernate.internal.util.EntityPrinter.toString(EntityPrinter.java:104)
at org.hibernate@5.3.7.Final-redhat-00001//org.hibernate.event.internal.AbstractFlushingEventListener.logFlushResults(AbstractFlushingEventListener.java:129)
at org.hibernate@5.3.7.Final-redhat-00001//org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:105)
at org.hibernate@5.3.7.Final-redhat-00001//org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:38)
at org.hibernate@5.3.7.Final-redhat-00001//org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1454)
at org.hibernate@5.3.7.Final-redhat-00001//org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:511)
at org.hibernate@5.3.7.Final-redhat-00001//org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3283)
at org.hibernate@5.3.7.Final-redhat-00001//org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2479)
at org.hibernate@5.3.7.Final-redhat-00001//org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:473)
at org.hibernate@5.3.7.Final-redhat-00001//org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl.beforeCompletion(JtaTransactionCoordinatorImpl.java:352)
at org.hibernate@5.3.7.Final-redhat-00001//org.hibernate.resource.transaction.backend.jta.internal.synchronization.SynchronizationCallbackCoordinatorNonTrackingImpl.beforeCompletion(SynchronizationCallbackCoordinatorNonTrackingImpl.java:47)
at org.hibernate@5.3.7.Final-redhat-00001//org.hibernate.resource.transaction.backend.jta.internal.synchronization.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:37)
at org.jboss.as.transactions@7.2.0.GA-redhat-00005//org.jboss.as.txn.service.internal.tsr.JCAOrderedLastSynchronizationList.beforeCompletion(JCAOrderedLastSynchronizationList.java:113)
at org.wildfly.transaction.client@1.1.2.Final-redhat-1//org.wildfly.transaction.client.AbstractTransaction.performConsumer(AbstractTransaction.java:236)
at org.wildfly.transaction.client@1.1.2.Final-redhat-1//org.wildfly.transaction.client.AbstractTransaction.performConsumer(AbstractTransaction.java:247)
at org.wildfly.transaction.client@1.1.2.Final-redhat-1//org.wildfly.transaction.client.AbstractTransaction$AssociatingSynchronization.beforeCompletion(AbstractTransaction.java:292)
at org.jboss.jts//com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:76)
at org.jboss.jts//com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:360)
at org.jboss.jts//com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:91)
at org.jboss.jts//com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:162)
at org.jboss.jts//com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1288)
... 113 more
UserPrincipalManager(过滤器)
用户服务
@RolesAllowed("**")
@Stateless
public class UserService {
...
public Usuari trace(UserPrincipal uPrincipal) throws AppException {
//I tried a simple db query and also get this error ConcurrentModificationException without anything else
...
List<VTaula> rolNames = vTaulaSvc.findByNames(rolsToAdd); //Error by calling findByNames(HashSet<String>)
...
}
}
@PermitAll
@Stateless
public class VTaulaService extends BusinessService<VTaula> implements VTaulaServiceable {
@PersistenceContext(unitName = "appPU")
protected EntityManager eManager;
...
public List<VTaula> findByNames(Set<String> names) throws AppException {
List<VTaula> vTaulas;
try {
Query q = eManager.createNamedQuery("SELECT g FROM VTaula g WHERE g.nomCA IN (:names)");
q.setParameter("names", names);
vTaulas = q.getResultList(); //Error ConcurrentModificationException
} catch (Exception e) {
log.error("findByNomCA", e);
throw new AppException("Error VTaula " + e, e);
}
return vTaulas;
}
...
}
@RolesAllowed(“**”)
@无国籍
公共类用户服务{
...
公共Usuari跟踪(UserPrincipal uPrincipal)引发AppException{
//我尝试了一个简单的db查询,并且在没有任何其他操作的情况下得到了这个错误ConcurrentModificationException
...
List rolNames=vtullasvc.findByNames(rolsToAdd);//调用findByNames(HashSet)时出错
...
}
}
VTaulaService
@RolesAllowed("**")
@Stateless
public class UserService {
...
public Usuari trace(UserPrincipal uPrincipal) throws AppException {
//I tried a simple db query and also get this error ConcurrentModificationException without anything else
...
List<VTaula> rolNames = vTaulaSvc.findByNames(rolsToAdd); //Error by calling findByNames(HashSet<String>)
...
}
}
@PermitAll
@Stateless
public class VTaulaService extends BusinessService<VTaula> implements VTaulaServiceable {
@PersistenceContext(unitName = "appPU")
protected EntityManager eManager;
...
public List<VTaula> findByNames(Set<String> names) throws AppException {
List<VTaula> vTaulas;
try {
Query q = eManager.createNamedQuery("SELECT g FROM VTaula g WHERE g.nomCA IN (:names)");
q.setParameter("names", names);
vTaulas = q.getResultList(); //Error ConcurrentModificationException
} catch (Exception e) {
log.error("findByNomCA", e);
throw new AppException("Error VTaula " + e, e);
}
return vTaulas;
}
...
}
@PermitAll
@无国籍
公共类VTaulaService扩展了BusinessService,实现了VTaulaServiceable{
@PersistenceContext(unitName=“appPU”)
受保护的实体管理员;
...
公共列表findByNames(集合名称)引发AppException{
列出vtulas;
试一试{
Query q=eManager.createNamedQuery(“从vtula g中选择g,其中g.nomCA位于(:names)”);
q、 setParameter(“名称”,名称);
vTaulas=q.getResultList();//错误ConcurrentModificationException
}捕获(例外e){
log.error(“findByNomCA”,e);
抛出新的异常(“错误VTaula”+e,e);
}
返回vtulas;
}
...
}
standalone.xml
...
<root-logger>
<level name="DEBUG"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
</handlers>
</root-logger>
...
...
<root-logger>
<level name="INFO"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
</handlers>
</root-logger>
...
<subsystem xmlns="urn:jboss:domain:logging:6.0">
<console-handler name="CONSOLE">
<level name="DEBUG"/>
<formatter>
<named-formatter name="COLOR-PATTERN"/>
</formatter>
</console-handler>
<periodic-rotating-file-handler name="FILE" autoflush="true">
<formatter>
<named-formatter name="PATTERN"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="server.log"/>
<suffix value=".yyyy-MM-dd"/>
<append value="true"/>
</periodic-rotating-file-handler>
<logger category="com.arjuna">
<level name="WARN"/>
</logger>
<logger category="org.jboss.as.config">
<level name="DEBUG"/>
</logger>
<logger category="sun.rmi">
<level name="WARN"/>
</logger>
<logger category="com.package">
<level name="DEBUG"/>
</logger>
<root-logger>
<level name="INFO"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
</handlers>
</root-logger>
<formatter name="PATTERN">
<pattern-formatter pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"/>
</formatter>
<formatter name="COLOR-PATTERN">
<pattern-formatter pattern="%K{level}%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"/>
</formatter>
</subsystem>
。。。
...
问题似乎出在根日志记录器和级别调试上,我只是将该级别恢复为INFO,这个问题就会消失
真正的问题似乎与hibernate日志有关,但不知道到底是什么
这是一个工作环境,但我也可以使用调试级别
standalone.xml
...
<root-logger>
<level name="DEBUG"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
</handlers>
</root-logger>
...
...
<root-logger>
<level name="INFO"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
</handlers>
</root-logger>
...
<subsystem xmlns="urn:jboss:domain:logging:6.0">
<console-handler name="CONSOLE">
<level name="DEBUG"/>
<formatter>
<named-formatter name="COLOR-PATTERN"/>
</formatter>
</console-handler>
<periodic-rotating-file-handler name="FILE" autoflush="true">
<formatter>
<named-formatter name="PATTERN"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="server.log"/>
<suffix value=".yyyy-MM-dd"/>
<append value="true"/>
</periodic-rotating-file-handler>
<logger category="com.arjuna">
<level name="WARN"/>
</logger>
<logger category="org.jboss.as.config">
<level name="DEBUG"/>
</logger>
<logger category="sun.rmi">
<level name="WARN"/>
</logger>
<logger category="com.package">
<level name="DEBUG"/>
</logger>
<root-logger>
<level name="INFO"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
</handlers>
</root-logger>
<formatter name="PATTERN">
<pattern-formatter pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"/>
</formatter>
<formatter name="COLOR-PATTERN">
<pattern-formatter pattern="%K{level}%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"/>
</formatter>
</subsystem>
结果standalone.xml记录器如下所示
standalone.xml
...
<root-logger>
<level name="DEBUG"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
</handlers>
</root-logger>
...
...
<root-logger>
<level name="INFO"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
</handlers>
</root-logger>
...
<subsystem xmlns="urn:jboss:domain:logging:6.0">
<console-handler name="CONSOLE">
<level name="DEBUG"/>
<formatter>
<named-formatter name="COLOR-PATTERN"/>
</formatter>
</console-handler>
<periodic-rotating-file-handler name="FILE" autoflush="true">
<formatter>
<named-formatter name="PATTERN"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="server.log"/>
<suffix value=".yyyy-MM-dd"/>
<append value="true"/>
</periodic-rotating-file-handler>
<logger category="com.arjuna">
<level name="WARN"/>
</logger>
<logger category="org.jboss.as.config">
<level name="DEBUG"/>
</logger>
<logger category="sun.rmi">
<level name="WARN"/>
</logger>
<logger category="com.package">
<level name="DEBUG"/>
</logger>
<root-logger>
<level name="INFO"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
</handlers>
</root-logger>
<formatter name="PATTERN">
<pattern-formatter pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"/>
</formatter>
<formatter name="COLOR-PATTERN">
<pattern-formatter pattern="%K{level}%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"/>
</formatter>
</subsystem>
不确定是否相关,但参数名称为nomsCA
非names
。还有,什么是eManager
?那是个打字错误。eManager是持久化单元的实体管理器,我在q.getResultList()中看不到CME的任何明显原因
但我有两个猜测:1)您可能同时修改名称
-在将其传递给setParameter()
之前尝试创建一个防御副本,2)它可能发生在您未共享的VTaula
实体中的某个地方。还要注意SessionImpl.doFlush()
:在执行查询之前,Hibernate尝试刷新当前会话期间发生的任何更改。这就是引发异常的地方,但源代码实际上可能是以前运行过的代码(在同一个会话中,因此可能是在UserService.trace()中)。由于stacktrace提到它发生在HashMap中,请查找在该事务中以及findByNames(…)之前对该映射所做的任何修改
call。我在findByNames之前调试过…我也遇到了同样的错误,所以这是一个开始。我将遵循这个线索。谢谢!好吧,org.hibernate.internal.util.EntityPrinter.toString(…)
似乎表明CME是在试图打印实体时发生的,可能是在某个调试语句中。因此,如您所述,通过增加日志级别禁用该语句可能是一种解决方法,但问题的根本原因似乎仍然存在于您的代码中。Hibernate中可能确实存在错误,但这与而不是你的代码是罪魁祸首-你有没有尝试用调试器一步一步地检查代码,看看修改发生在哪里?我尝试用github的另一个项目,用一个简单的jpa查询和相同的错误进行复制,所以看起来hibernate出了问题……但我不能说是什么