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决赛
从无状态ejb中的方法执行jpa查询时,我收到一个错误ConcurrentModificationException。它一直工作到现在,不知道它可能是什么。查询仅获取条件中的记录

错误日志

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出了问题……但我不能说是什么