Play 2.6.11 HikariCP error "Validating connection"

218 views
Skip to first unread message

Thibault Meyer

unread,
Jan 15, 2018, 10:13:33 AM1/15/18
to Play Framework
Hello,

Since Play 2.6.11, it seems that HikariCP doing something bad, many time per days we have this error :


Validating connection

org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend. at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:333) at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441) at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365) at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:155) at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:132) at org.postgresql.jdbc.PgConnection.isValid(PgConnection.java:1364) at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive(PoolBase.java:160) at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:171) at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:147) at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:85) at play.db.ebean.orm.DefaultEbeanConfig$EbeanConfigParser$WrappingDatasource.getConnection(DefaultEbeanConfig.java:439) at io.ebeaninternal.server.transaction.TransactionFactoryBasic.createQueryTransaction(TransactionFactoryBasic.java:31) at io.ebeaninternal.server.transaction.TransactionManager.createQueryTransaction(TransactionManager.java:260) at io.ebeaninternal.server.core.DefaultServer.createQueryTransaction(DefaultServer.java:2147) at io.ebeaninternal.server.core.OrmQueryRequest.initTransIfRequired(OrmQueryRequest.java:253) at io.ebeaninternal.server.core.DefaultServer.findSingleAttributeList(DefaultServer.java:1305) at io.ebeaninternal.server.querydefn.DefaultOrmQuery.findSingleAttributeList(DefaultOrmQuery.java:1285) at io.ebeaninternal.server.expression.DefaultExpressionList.findSingleAttributeList(DefaultExpressionList.java:418) at controllers.CustomerDirectives.checkStationAndRoles(CustomerDirectives.java:45) at controllers.SkiPassController.GET_SkiPasses(SkiPassController.java:111) at router.Routes$$anonfun$routes$1.$anonfun$applyOrElse$26(Routes.scala:1041) at play.core.routing.HandlerInvokerFactory$$anon$3.resultCall(HandlerInvoker.scala:134) at play.core.routing.HandlerInvokerFactory$$anon$3.resultCall(HandlerInvoker.scala:133) at play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$8$$anon$2$$anon$1.invocation(HandlerInvoker.scala:108) at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:88) at play.http.DefaultActionCreator$1.call(DefaultActionCreator.java:31) at actions.JWTCustomerRequiredAction.call(JWTCustomerRequiredAction.java:31) at play.core.j.JavaAction.$anonfun$apply$8(JavaAction.scala:138) at scala.concurrent.Future$.$anonfun$apply$1(Future.scala:655) at scala.util.Success.$anonfun$map$1(Try.scala:251) at scala.util.Success.map(Try.scala:209) at scala.concurrent.Future.$anonfun$map$1(Future.scala:289) at scala.concurrent.impl.Promise.liftedTree1$1(Promise.scala:29) at scala.concurrent.impl.Promise.$anonfun$transform$1(Promise.scala:29) at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60) at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:56) at play.api.libs.streams.Execution$trampoline$.execute(Execution.scala:70) at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:48) at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:68) at scala.concurrent.impl.Promise$KeptPromise$Kept.onComplete(Promise.scala:368) at scala.concurrent.impl.Promise$KeptPromise$Kept.onComplete$(Promise.scala:367) at scala.concurrent.impl.Promise$KeptPromise$Successful.onComplete(Promise.scala:375) at scala.concurrent.impl.Promise.transform(Promise.scala:29) at scala.concurrent.impl.Promise.transform$(Promise.scala:27) at scala.concurrent.impl.Promise$KeptPromise$Successful.transform(Promise.scala:375) at scala.concurrent.Future.map(Future.scala:289) at scala.concurrent.Future.map$(Future.scala:289) at scala.concurrent.impl.Promise$KeptPromise$Successful.map(Promise.scala:375) at scala.concurrent.Future$.apply(Future.scala:655) at play.core.j.JavaAction.apply(JavaAction.scala:138) at play.api.mvc.Action.$anonfun$apply$2(Action.scala:96) at play.api.libs.streams.StrictAccumulator.$anonfun$mapFuture$4(Accumulator.scala:174) at scala.util.Try$.apply(Try.scala:209) at play.api.libs.streams.StrictAccumulator.$anonfun$mapFuture$3(Accumulator.scala:174) at scala.Function1.$anonfun$andThen$1(Function1.scala:52) at scala.Function1.$anonfun$andThen$1(Function1.scala:52) at scala.Function1.$anonfun$andThen$1(Function1.scala:52) at play.api.libs.streams.StrictAccumulator.run(Accumulator.scala:207) at play.api.libs.streams.FlattenedAccumulator.$anonfun$run$2(Accumulator.scala:231) at scala.concurrent.Future.$anonfun$flatMap$1(Future.scala:304) at scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:37) at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60) at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55) at akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run$1(BatchingExecutor.scala:91) at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12) at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:81) at akka.dispatch.BatchingExecutor$BlockableBatch.run(BatchingExecutor.scala:91) at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40) at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(ForkJoinExecutorConfigurator.scala:43) at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) Caused by: java.net.SocketTimeoutException: Read timed out at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) at java.net.SocketInputStream.read(SocketInputStream.java:171) at java.net.SocketInputStream.read(SocketInputStream.java:141) at org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:140) at org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:109) at org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:67) at org.postgresql.core.PGStream.receiveChar(PGStream.java:293) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1938) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:306) ... 72 common frames omitted






Marcos Pereira

unread,
Jan 15, 2018, 3:28:26 PM1/15/18
to play-fr...@googlegroups.com
Hi Thibault,

Could you please add HikariCP 2.7.6 as a dependency and confirm this fixes the problem? Asking because of https://github.com/playframework/playframework/pull/8154.

Best.

--
You received this message because you are subscribed to the Google Groups "Play Framework" group.
To unsubscribe from this group and stop receiving emails from it, send an email to play-framework+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/play-framework/db8c5a1a-4ddd-4ee4-a5a5-c789e63b20ca%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.



--
Marcos Pereira
Software Engineer, Lightbend.com

Thibault Meyer

unread,
Jan 16, 2018, 2:32:05 AM1/16/18
to Play Framework
Hello Marcos,

I have tested with last version of HikariCP, same issue. It seem the issue comme from the "connectionTestQuery" setting. By default it was set to "null" (reference.conf from Play) but it seem Play don't use JDBC4; so HikariCP throw an I/O exception. I set the setting to "SELECT 1" and everything run well.


extract from HikariCP documentation
If your driver supports JDBC4 we strongly recommend not setting this property. This is for "legacy" drivers that do not support the JDBC4 Connection.isValid() API. This is the query that will be executed just before a connection is given to you from the pool to validate that the connection to the database is still alive. Again, try running the pool without this property, HikariCP will log an error if your driver is not JDBC4 compliant to let you know. Default: none
To unsubscribe from this group and stop receiving emails from it, send an email to play-framewor...@googlegroups.com.

Marcos Pereira

unread,
Jan 16, 2018, 8:24:53 AM1/16/18
to play-fr...@googlegroups.com
Hi Thibault,

Play is not configuring HikariCP to not use JDBC4. To be honest, I'm not aware that such configuration even exists. Which version of PostgreSQL's driver are you using? I know they have these JDBC3 versions of the driver.

Best.

To unsubscribe from this group and stop receiving emails from it, send an email to play-framework+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/play-framework/5b2458e6-c003-4f1c-bfa0-f1ec0a653159%40googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

Thibault Meyer

unread,
Jan 17, 2018, 1:29:02 AM1/17/18
to Play Framework
Hello,

I have tested with two versions : the release 42.1.4 and directly with the last version from the 'master' branch of their github project. The only difference, is the 'master' has the method "getNetworkTimeout' (used by HikariCP)


Regards.
Reply all
Reply to author
Forward
0 new messages