2017-08-13 846 views
0

我用的PostgreSQL 9.3和5.2的Liferaycom.liferay.portal.kernel.job.JobExecutionException:org.postgresql.util.PSQLException:这个连接已经关闭

系统工作正常,但一段时间后,我有我在日志文件中有连接丢失问题。

(org.springframework.scheduling.quartz.SchedulerFactoryBean#6e2243fb_Worker-2) 07:19:09,914 ERROR [JobWrapper:81] com.liferay.portal.kernel.job.JobExecutionException: org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend. 
com.liferay.portal.kernel.job.JobExecutionException: org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend. 
    at com.liferay.counter.service.persistence.ConnectionHeartbeatJob.execute(ConnectionHeartbeatJob.java:55) 
    at com.liferay.portal.job.JobWrapper.execute(JobWrapper.java:69) 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:529) 
Caused by: org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend. 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:226) 
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:424) 
    at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:321) 
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:313) 
    at com.mchange.v2.c3p0.impl.NewProxyStatement.execute(NewProxyStatement.java:1006) 
    at com.liferay.counter.service.persistence.ConnectionHeartbeatJob.sendHeartbeat(ConnectionHeartbeatJob.java:75) 
    at com.liferay.counter.service.persistence.ConnectionHeartbeatJob.execute(ConnectionHeartbeatJob.java:52) 
    ... 3 more 
Caused by: java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(SocketInputStream.java:168) 
    at org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:143) 
    at org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:112) 
    at org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:70) 
    at org.postgresql.core.PGStream.ReceiveChar(PGStream.java:283) 
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1799) 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:200) 
    ... 9 more 
2017-08-13 08:19:09,901 INFO [STDOUT] (org.springframework.scheduling.quartz.SchedulerFactoryBean#6e2243fb_Worker-1) 08:19:09,901 WARN [NewPooledConnection:486] [c3p0] A PooledConnection that has already signalled a Connection error is still in use! 
2017-08-13 08:19:09,903 INFO [STDOUT] (org.springframework.scheduling.quartz.SchedulerFactoryBean#6e2243fb_Worker-1) 08:19:09,902 WARN [NewPooledConnection:487] [c3p0] Another error has occurred [ org.postgresql.util.PSQLException: This connection has been closed. ] which will not be reported to listeners! 
org.postgresql.util.PSQLException: This connection has been closed. 
    at org.postgresql.jdbc.PgConnection.checkClosed(PgConnection.java:786) 
    at org.postgresql.jdbc.PgConnection.createStatement(PgConnection.java:1598) 
    at org.postgresql.jdbc.PgConnection.createStatement(PgConnection.java:405) 
    at com.mchange.v2.c3p0.impl.NewProxyConnection.createStatement(NewProxyConnection.java:96) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.invoke(LazyConnectionDataSourceProxy.java:364) 
    at com.sun.proxy.$Proxy261.createStatement(Unknown Source) 
    at com.liferay.counter.service.persistence.ConnectionHeartbeatJob.sendHeartbeat(ConnectionHeartbeatJob.java:73) 
    at com.liferay.counter.service.persistence.ConnectionHeartbeatJob.execute(ConnectionHeartbeatJob.java:52) 
    at com.liferay.portal.job.JobWrapper.execute(JobWrapper.java:69) 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:529) 
2017-08-13 08:19:09,905 INFO [STDOUT] (org.springframework.scheduling.quartz.SchedulerFactoryBean#6e2243fb_Worker-1) 08:19:09,903 ERROR [JobWrapper:81] com.liferay.portal.kernel.job.JobExecutionException: org.postgresql.util.PSQLException: This connection has been closed. 
com.liferay.portal.kernel.job.JobExecutionException: org.postgresql.util.PSQLException: This connection has been closed. 
    at com.liferay.counter.service.persistence.ConnectionHeartbeatJob.execute(ConnectionHeartbeatJob.java:55) 
    at com.liferay.portal.job.JobWrapper.execute(JobWrapper.java:69) 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:529) 
Caused by: org.postgresql.util.PSQLException: This connection has been closed. 
    at org.postgresql.jdbc.PgConnection.checkClosed(PgConnection.java:786) 
    at org.postgresql.jdbc.PgConnection.createStatement(PgConnection.java:1598) 
    at org.postgresql.jdbc.PgConnection.createStatement(PgConnection.java:405) 
    at com.mchange.v2.c3p0.impl.NewProxyConnection.createStatement(NewProxyConnection.java:96) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.invoke(LazyConnectionDataSourceProxy.java:364) 
    at com.sun.proxy.$Proxy261.createStatement(Unknown Source) 
    at com.liferay.counter.service.persistence.ConnectionHeartbeatJob.sendHeartbeat(ConnectionHeartbeatJob.java:73) 
    at com.liferay.counter.service.persistence.ConnectionHeartbeatJob.execute(ConnectionHeartbeatJob.java:52) 
    ... 3 more 

这是我在配置portal-ext.properties

# 
# PostgreSQL 
# 
jdbc.default.driverClassName=org.postgresql.Driver 
jdbc.default.url=jdbc:postgresql://192.168.2.3:5432/portal 
jdbc.default.username=postgres 
jdbc.default.password=postgres 

,我尝试添加这些行,但错误依然出现:

jdbc.default.testConnectionOnCheckout=true 
jdbc.default.preferredTestQuery=SELECT 1 
jdbc.default.acquireIncrement=1 
jdbc.default.maxIdleTime=10800 
jdbc.default.maxConnectionAge=14400 
jdbc.default.numHelperThreads=20 

我无法理解错误, 可能是postgresql设置或liferay连接池设置中的问题

我此行postgresql.conf中可以改变来解决这个问题:

#synchronous_standby_names = '' # standby servers that provide sync rep 
       # comma-separated list of application_name 
       # from standby(s); '*' = all 

更新时间:

显示此错误日志文件中几次,但第一次出现是在一分钟后可能需要1小时。

我在Docker容器中运行Postgresql。

liferay和数据库容器在同一台物理服务器上。

我不知道为什么数据库连接在某些时候无法访问。

这是泊坞窗版本:

docker version 
Client: 
Version:  17.06.0-ce 
API version: 1.30 
Go version: go1.8.3 
Git commit: 02c1d87 
Built:  Fri Jun 10 21:20:36 2017 
OS/Arch:  linux/amd64 

Server: 
Version:  17.06.0-ce 
API version: 1.30 (minimum version 1.12) 
Go version: go1.8.3 
Git commit: 02c1d87 
Built:  Fri Jun 10 21:21:56 2017 
OS/Arch:  linux/amd64 
Experimental: false 

回答

0

哇,Liferay的5.2?这是一段时间...

第一个问题是:这是否经常/每次都会出现?你能重现它还是只是一次?发生这种情况的一个常见原因是,Postgresql更新并重新启动时。如果在事务中发生这种情况,我希望Postgresql可以优雅地关闭,例如在关闭之前完成交易。

另一方面,在它再次启动之前,它将在一段时间内无法访问。即使Liferay(或连接池)确定当前连接无效(请参阅testQuery),它在服务器关闭期间将无法重新连接。如果Postgresql在不同于运行Liferay的服务器上运行的服务器上运行,它不仅可以重新启动数据库本身,还可以完全重启操作系统。自然,Liferay将在此期间失去联系。

由于您没有提供任何其他重现步骤的指示,我会说这是一个很好的开始猜测。否则需要更多信息。

+0

感谢您的回复,我已经更新了我的问题,我使用了数据库容器,我认为postgreSQL没有与Docker一起使用的问题,这个错误在日志文件中多次显示,但是第一次出现是在一些分钟可能需要1个小时。 – franco

相关问题