【问题标题】:Exception IllegalMonitorStateException for JPA in dbcp2/tomcatdbcp2/tomcat 中 JPA 的异常 IllegalMonitorStateException
【发布时间】:2023-01-13 09:24:46
【问题描述】:

我只有在收集 JPA 结果时才有异常:

03-Dec-2022 12:29:22.546 SEVERE [SMTP Server Worker (rm-2)] de.e_nexus.server.mail.DefaultSMTPServer$SMTPConnectionWorker$TransportSocket.<init> Created transport socket: a48fc8d5-8cf0-4c9f-88d2-201a47621987 using Socket[addr=/194.50.69.4,port=35600,localport=25]
Exception in thread "Thread-27" java.lang.IllegalMonitorStateException
    at java.base/java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:175)
    at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1007)
    at java.base/java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:494)
    at org.apache.tomcat.dbcp.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:598)
    at org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:436)
    at org.apache.tomcat.dbcp.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:353)
    at org.apache.tomcat.dbcp.dbcp2.PoolingDataSource.getConnection(PoolingDataSource.java:134)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:753)
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)
    at org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:38)
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:108)
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:138)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.connection(StatementPreparerImpl.java:50)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:149)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:176)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:151)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:2103)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2040)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2018)
    at org.hibernate.loader.Loader.doQuery(Loader.java:948)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349)
    at org.hibernate.loader.Loader.doList(Loader.java:2849)
    at org.hibernate.loader.Loader.doList(Loader.java:2831)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2663)
    at org.hibernate.loader.Loader.list(Loader.java:2658)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:506)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:400)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:219)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1414)
    at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1625)
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1593)
    at org.hibernate.query.Query.getResultList(Query.java:165)
    at jdk.internal.reflect.GeneratedMethodAccessor4243.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:402)
    at jdk.proxy11/jdk.proxy11.$Proxy799.getResultList(Unknown Source)
    at de.e_nexus.web.rm.mail.veto.dnsbl.DNSBlackList.veto(DNSBlackList.java:39)
    at de.e_nexus.web.rm.mail.veto.dnsbl.DNSBlackList.veto(DNSBlackList.java:29)
    at de.e_nexus.utils.VetoCouncil$1.ask(VetoCouncil.java:87)
    at de.e_nexus.utils.VetoCouncil$1Survey.run(VetoCouncil.java:73)

这是类:

/*  ___     _
 * | _ \___| |___ __ _ ___ ___  Copyright 2016
 * |   / -_) / -_) _` (_-</ -_) https://www.e-nexus.de./
 * |_|_\___|_\___\__,_/__/\___| by Peter Rader   _
 * |  \/  |__ _ _ _  __ _ __ _ ___ _ __  ___ _ _| |_
 * | |\/| / _` | ' \/ _` / _` / -_) '  \/ -_) ' \  _|
 * |_|  |_\__,_|_||_\__,_\__, \___|_|_|_\___|_||_\__|
 * All rights reserved    |___/
 */
package de.e_nexus.web.rm.mail.veto.dnsbl;

import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.xbill.DNS.ARecord;
import org.xbill.DNS.Lookup;
import org.xbill.DNS.Record;
import org.xbill.DNS.Type;

import de.e_nexus.server.mail.AllowConnection;
import de.e_nexus.server.mail.VetoConnection;
import de.e_nexus.web.rm.entity.DNSBlacklistService;

@Named
public class DNSBlackList implements VetoConnection {

    @PersistenceContext
    private final EntityManager entityManager = null;
    public static final Logger LOG = Logger.getLogger(DNSBlackList.class.getCanonicalName());

    @Override
    public boolean veto(final AllowConnection plan) {
        List<DNSBlacklistService> blacklistServices = entityManager.createQuery("FROM " + DNSBlacklistService.class.getCanonicalName(), DNSBlacklistService.class)
                .getResultList(); // <-- this is line 39
        String hostName = plan.getIncommingIP().getHostName();
        LOG.finer("Ask for host: " + hostName);
        for (DNSBlacklistService dnsBlacklistService : blacklistServices) {
            try {
                String url = hostName + "." + dnsBlacklistService.getDomainName();
                LOG.fine("Ask url: " + url);
                Lookup lookup = new Lookup(url, Type.ANY);
                Record[] run = lookup.run();
                if (run != null) {
                    for (Record r : run) {
                        if (r instanceof ARecord) {
                            plan.setMessage("Your a spammer said " + dnsBlacklistService.getDomainName() + "!");
                            LOG.warning("Service " + dnsBlacklistService.getDomainName() + " said " + plan.getIncommingIP() + " is spammer!");
                            return true;
                        }
                    }
                }
            } catch (Exception e) {
                LOG.log(Level.INFO, "Cant ask DNSBL", e);
            }
        }
        return false;
    }
}

【问题讨论】:

  • 您使用的是什么版本的 tomcat、hibernate、java?另外,该代码是否在事务中运行?

标签: java tomcat exception


【解决方案1】:

当线程试图释放它不拥有的锁时抛出此异常。您的应用程序中的线程同步可能存在问题,特别是在与 JPA 结果交互的线程中。

这可能是由您的代码中的一个错误引起的,在该错误中,多个线程试图访问同一资源,而一个线程释放了一个它没有获得的锁。

您可以尝试通过在与 JPA 结果交互的代码中添加更多日志语句来调试问题,并查看您是否可以确定抛出异常的确切位置。您还可以尝试在测试环境中重现异常,以查看是否可以识别导致异常的模式。

也有可能该异常是由 JDBC 驱动程序或连接池中的错误引起的,在这种情况下,您可以检查更新并尝试使用不同版本的驱动程序或不同的连接池库。

检查线程转储也是一个好主意,它可以帮助您确定问题的根本原因。

【讨论】:

    猜你喜欢
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 2012-07-03
    • 2014-03-30
    • 2018-08-07
    • 1970-01-01
    • 2018-09-26
    相关资源
    最近更新 更多