Play 2.5.4 failed to start occasionally when combining with play-slick and dependency injection.

232 views
Skip to first unread message

pishen tsai

unread,
Aug 17, 2016, 4:54:09 AM8/17/16
to play-framework
I'm running Play 2.5.4 on ec2 using the executable from universal:packageZipTarball, and sometime it just failed with following error:

Oops, cannot start the server.
com
.google.inject.CreationException: Unable to create injector, see the following errors:

1) Error injecting constructor, java.sql.SQLTimeoutException: Timeout after 1031ms of waiting for a connection.
  at controllers
.Main.<init>(Main.scala:27)
  at controllers
.Main.class(Main.scala:26)
 
while locating controllers.Main
   
for parameter 1 at router.Routes.<init>(Routes.scala:35)
 
while locating router.Routes
 
while locating play.api.inject.RoutesProvider
 
while locating play.api.routing.Router
   
for parameter 0 at play.api.http.JavaCompatibleHttpRequestHandler.<init>(HttpRequestHandler.scala:200)
 
while locating play.api.http.JavaCompatibleHttpRequestHandler
 
while locating play.api.http.HttpRequestHandler
   
for parameter 4 at play.api.DefaultApplication.<init>(Application.scala:221)
  at play
.api.DefaultApplication.class(Application.scala:221)
 
while locating play.api.DefaultApplication
 
while locating play.api.Application

1 error
        at com
.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:466)
        at com
.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:184)
        at com
.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110)
        at com
.google.inject.Guice.createInjector(Guice.java:96)
        at com
.google.inject.Guice.createInjector(Guice.java:84)
        at play
.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:181)
        at play
.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:123)
        at play
.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21)
        at play
.core.server.ProdServerStart$.start(ProdServerStart.scala:47)
        at play
.core.server.ProdServerStart$.main(ProdServerStart.scala:22)
        at play
.core.server.ProdServerStart.main(ProdServerStart.scala)
Caused by: java.sql.SQLTimeoutException: Timeout after 1031ms of waiting for a connection.
        at com
.zaxxer.hikari.pool.BaseHikariPool.getConnection(BaseHikariPool.java:227)
        at com
.zaxxer.hikari.pool.BaseHikariPool.getConnection(BaseHikariPool.java:182)
        at com
.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:93)
        at slick
.jdbc.hikaricp.HikariCPJdbcDataSource.createConnection(HikariCPJdbcDataSource.scala:12)
        at slick
.jdbc.JdbcBackend$BaseSession.conn$lzycompute(JdbcBackend.scala:415)
        at slick
.jdbc.JdbcBackend$BaseSession.conn(JdbcBackend.scala:414)
        at slick
.jdbc.JdbcBackend$BaseSession.metaData$lzycompute(JdbcBackend.scala:420)



Sorry I can't recover all the error, and after restarting the machine, it can start normally again for now.
But I suspect that this may happen again since I've already experienced this failed -> back to normal -> failed -> back to normal process several times, and I just didn't know what did I do to make it back to normal.
I'm using play-slick to connect with H2 (embedded disk mode), and using dependency injection by DatabaseConfigProvider.

Here is a beginning part of my controller (actor "annoies" and "lshs" also have DatabaseConfigProvider injected):

@Singleton
class Main @Inject() (
  auth
: Auth,
  dbConfigProvider
: DatabaseConfigProvider,
 
@Named("annoies") annoies: ActorRef,
 
@Named("lshs") lshs: ActorRef
)(implicit ws: WSClient) extends Controller {
 
implicit val timeout = Timeout(5.seconds)

  val conf
= ConfigFactory.load()
  val backgrounds
= conf.getStringList("backgrounds").asScala

 
//prepare database
  val dbConfig
= dbConfigProvider.get[JdbcProfile]
  val db
= dbConfig.db

  val init
= db.run(MTable.getTables).flatMap { tables =>
    val existTables
= tables.map(_.name.name).toSet
   
if (!existTables.contains(Algorithms.table.baseTableRow.tableName)) {
      db
.run(Algorithms.table.schema.create)
   
} else {
     
Future.successful(())
   
}
 
}
 
Await.result(init, Duration.Inf)
 
...

And here is my config:


play
.crypto.secret = "..."

slick
.dbs.default {
  driver
= "slick.driver.H2Driver$"
  db
{
    driver
= "org.h2.Driver"
    url
= "jdbc:h2:/home/pishentsai/app-h2"
 
}
}

backgrounds
= [...]



This error only happen on my ec2 machine. I've tried it on my laptop and everything work just fine. (Both my laptop and ec2 has Ubuntu 16.04 with OpenJDK 8 installed.)

Any suggestion on this? Or are there any way for me to get the more detailed debug message when I meet this error next time?

Thanks!

pishen
Reply all
Reply to author
Forward
0 new messages