简体   繁体   English

即使定义了超时,Postgres JDBC线程也会停留在java.net.SocketInputStream.socketRead0上

[英]Postgres JDBC thread stuck on java.net.SocketInputStream.socketRead0 even though timeout was defined

We are using a Java app on a Wildfly 16 connected with a Postgres 9.4 database using EclipseLink. 我们正在使用EclipseLink在与Postgres 9.4数据库连接的Wildfly 16上使用Java应用程序。 The Application Server is configured to use connection pooling. Application Server配置为使用连接池。 The app is indexing items to a Solr instance over night and from time to time we had problems with blocking threads. 该应用程序在夜间将项目索引到Solr实例,我们有时会遇到阻塞线程的问题。 It seems that a database query isn't returning after all. 看来数据库查询毕竟没有返回。 We set a timeout for queries in our persistence unit, which doesn't seem to work. 我们在持久性单元中为查询设置了超时,这似乎不起作用。 We added following entry in our persistence.xml: 我们在persistence.xml中添加了以下条目:

<property name="javax.persistence.query.timeout" value="30000"/>

The system is using a Java 11 jre. 系统正在使用Java 11 jre。 We are using the docker wildfly image ( https://hub.docker.com/r/jboss/wildfly/dockerfile ) as a base, but have seen this problems with other Application Servers and Java versions as well. 我们使用docker wildfly映像( https://hub.docker.com/r/jboss/wildfly/dockerfile )作为基础,但其他应用程序服务器和Java版本也遇到了此问题。

The thread dump shows some details. 线程转储显示一些细节。 The process is running multiple hours. 该过程运行多个小时。 We were expecting that a exception would be thrown after 30s. 我们期望30秒后会引发异常。 What are we missing? 我们缺少什么?

"Indexer thread" #181 daemon prio=5 os_prio=0 cpu=3845600.45ms elapsed=124856.57s tid=0x000000000a51b800 nid=0x12d runnable  [0x00007fb51dcb9000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(java.base@11.0.4/Native Method)
        at java.net.SocketInputStream.socketRead(java.base@11.0.4/SocketInputStream.java:115)
        at java.net.SocketInputStream.read(java.base@11.0.4/SocketInputStream.java:168)
        at java.net.SocketInputStream.read(java.base@11.0.4/SocketInputStream.java:140)
        at org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:146)
        at org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:115)
        at org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:71)
        at org.postgresql.core.PGStream.ReceiveChar(PGStream.java:283)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1719)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:173)
        - locked  (a org.postgresql.core.v3.QueryExecutorImpl)
        at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:622)
        at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:472)
        at org.postgresql.jdbc.PgStatement.executeUpdate(PgStatement.java:429)
        at jdk.internal.reflect.GeneratedMethodAccessor24.invoke(Unknown Source)
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@11.0.4/DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(java.base@11.0.4/Method.java:566)
        at org.postgresql.ds.PGPooledConnection$StatementHandler.invoke(PGPooledConnection.java:466)
        at com.sun.proxy.$Proxy69.executeUpdate(Unknown Source)
        at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeUpdate(WrappedPreparedStatement.java:537)
        at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:898)
        at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:970)
        at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:640)
        at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:567)
        at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:2096)
        at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:311)
        at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:275)
        at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:261)
        at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.updateObject(DatasourceCallQueryMechanism.java:832)
        at org.eclipse.persistence.internal.queries.StatementQueryMechanism.updateObject(StatementQueryMechanism.java:437)
        at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.updateObjectForWriteWithChangeSet(DatabaseQueryMechanism.java:1093)
        at org.eclipse.persistence.queries.UpdateObjectQuery.executeCommitWithChangeSet(UpdateObjectQuery.java:86)
        at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:316)
        at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:60)
        at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:914)
        at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:813)
        at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:110)
        at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:87)
        at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2981)
        at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1895)
        at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1877)
        at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1827)
        at org.eclipse.persistence.internal.sessions.CommitManager.commitChangedObjectsForClassWithChangeSet(CommitManager.java:275)
        at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:133)
        at org.eclipse.persistence.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:4387)
        at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1493)
        at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1583)
        at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:280)
        at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:1220)
        at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:136)
        at com.freiheit.vrms.persistence.SystemObjectPersistenceService.createOrUpdateNextIndexerRun(SystemObjectPersistenceService.java:2134)
        at com.freiheit.vrms.service.search.SearchService.attributeIndexFields(SearchService.java:322)
        at com.freiheit.vrms.service.search.SearchService.indexObjectInternal(SearchService.java:848)
        at com.freiheit.vrms.service.search.SearchService.indexObjectInForeground(SearchService.java:752)
        - locked  (a java.lang.Object)
        at com.freiheit.vrms.service.search.SearchService.indexObjectInForeground(SearchService.java:746)
        at com.freiheit.vrms.service.search.IndexJob$JobType$2.execute(IndexJob.java:60)
        at com.freiheit.vrms.service.search.IndexJob.execute(IndexJob.java:104)
        at com.freiheit.vrms.service.search.IndexQueue.handleMessage(IndexQueue.java:243)
        at com.freiheit.vrms.service.search.IndexQueue.run(IndexQueue.java:155)
        at java.lang.Thread.run(java.base@11.0.4/Thread.java:834)

   Locked ownable synchronizers:
        -  (a java.util.concurrent.locks.ReentrantLock$FairSync)

EDIT: I would like to add some additional code, which causes the thread to freeze. 编辑:我想添加一些其他代码,这将导致线程冻结。

final EntityTransaction transaction = em.getTransaction();
transaction.begin();
updateNextIndexerRun( em, id, nextIndexerRun );
transaction.commit();

As shown above the thread stucked at the line transaction.commit() . 如上图所示,线程卡在了transaction.commit() This snippet is called thousands of times a day and isn't making any trouble most of the time. 该代码段每天被调用数千次,并且在大多数情况下不会造成任何麻烦。 the table in which the data will be persisted has ~20000 entries at a time. 数据将被持久存储在其中的表一次具有约20000个条目。 The method updateNextIndexerRun is defined this way: 方法updateNextIndexerRun是这样定义的:

private void updateNextIndexerRun( final EntityManager em, final Long id, @Nullable final Calendar newNextIndexerRun ) {

    final NextIndexerRunDBBean oldNextIndexerRun = getNextIndexerRun( em, id );

    if ( newNextIndexerRun == null && oldNextIndexerRun != null ) {
        em.remove( oldNextIndexerRun );
    } else if ( newNextIndexerRun != null ) {
        if ( oldNextIndexerRun == null ) {
            em.persist( new NextIndexerRunDBBean( id, newNextIndexerRun ) );
        } else {
            em.merge( new NextIndexerRunDBBean( id, newNextIndexerRun ) );
        }
    }
}

The query itself is run under 30 seconds, so the timeout isn't being applied. 查询本身在30秒内运行,因此未应用超时。 Now from here we see 现在从这里我们看到

the JPQL query above will time out after 50 milliseconds unless the result set is being fetched prior to the timeout threshold. 除非在超时阈值之前获取结果集,否则上面的JPQL查询将在50毫秒后超时。

You're already reading the resultset, but it's either too large or there's a problem reading it fast enough. 您已经在读取结果集,但是它太大或者读取速度不够快有问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 陷入java.net.SocketInputStream.socketRead0(本机方法) - Got stuck at java.net.SocketInputStream.socketRead0(Native Method) Java Web应用程序线程因java.net.SocketInputStream.socketRead0(本地方法)上的DB操作而卡住 - Java Web application thread getting stuck for DB operation at java.net.SocketInputStream.socketRead0(Native Method) 数据库调用卡在 java.net.SocketInputStream.socketRead0(Native Method) - Database call stuck at java.net.SocketInputStream.socketRead0(Native Method) java.net.SocketInputStream.socketRead0(本机方法) - java.net.SocketInputStream.socketRead0(Native Method) java.net.SocketInputStream.socketRead0的可能原因 - Possible reasons for java.net.SocketInputStream.socketRead0 IBM WAS 5.1 / Tread转储分析:Servlet.Engine.Transports卡在java.net.SocketInputStream.socketRead0上 - IBM WAS 5.1 / Tread dump analysis: Servlet.Engine.Transports stuck on java.net.SocketInputStream.socketRead0 陷入SocketInputStream.socketRead0 - Getting stuck at SocketInputStream.socketRead0 Jaybird SocketInputStream.socketread0 线程阻塞 - Jaybird SocketInputStream.socketread0 thread blocking 如何防止在 Java 中挂起 SocketInputStream.socketRead0? - How to prevent hangs on SocketInputStream.socketRead0 in Java? 线程在socketRead0 Java中挂起 - thread hangs in socketRead0 Java
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM