代码之家  ›  专栏  ›  技术社区  ›  Michael Lafayette

如何使Play 2 Scala与远程PostgreSQL数据库服务器一起工作?

  •  0
  • Michael Lafayette  · 技术社区  · 9 年前

    My Play应用程序可以连接到MySQL服务器。

    为什么它不能连接到PostgreSQL服务器?

    在项目目录中。。。

    // build.sbt file...
    
    name := "scalaplay1"
    
    version := "1.0"
    
    lazy val `scalaplay1` = (project in file(".")).enablePlugins(PlayScala)
    
    scalaVersion := "2.11.7"
    
    libraryDependencies ++= Seq( jdbc , cache , ws   , specs2 % Test,
      "mysql" % "mysql-connector-java" % "5.1.38"      // This works
      // "postgresql" % "postgresql" % "9.1-901.jdbc4" // This does not
      )
    
    unmanagedResourceDirectories in Test <+=  baseDirectory ( _ /"target/web/public/test" )  
    
    resolvers += "scalaz-bintray" at "https://dl.bintray.com/scalaz/releases"  
    

    配置文件。。。

    // conf/application.conf file...
    
    db.default.driver=com.mysql.jdbc.Driver   // This works
    db.default.url="jdbc:mysql://<my_server>:<port_number>/<db_name>"
    
    #db.default.driver=org.postgresql.Driver  // This fails (line 48)
    #db.default.url="jdbc:postgresql://<my_server>:<port_number>/<db_name>"
    
    db.default.username="username"
    db.default.password= "password"
    

    以下是Play失败的原因(在浏览器上)。。。

    Configuration error
    
    Cannot connect to database [default]
    
    In /C:/Users/User/IdeaProjects/project/target/scala-2.11/classes/application.conf:48
    
    47. db.default.driver=org.postgresql.Driver // This fails (line 48)
    48. db.default.url="jdbc:postgresql://<my_server>:<port_number>/<db_name>"
    

    以下是Play失败的原因(在终端中)。。。

    --- (Running the application, auto-reloading is enabled) ---
    
    [info] p.c.s.NettyServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000
    
    Server started, use Alt+D to stop
    
    [success] Compiled in 567ms
    [warn] application - Logger configuration in conf files is deprecated and has no effect. Use a logback configuration file instead.
    [info] application - Creating Pool for datasource 'default'
    [error] application - 
    
    ! @6oombhen4 - Internal server error, for (GET) [/] ->
    
    play.api.Configuration$$anon$1: Configuration error[Cannot connect to database [default]]
        at play.api.Configuration$.configError(Configuration.scala:178) ~[play_2.11-2.4.6.jar:2.4.6]
        at play.api.Configuration.reportError(Configuration.scala:829) ~[play_2.11-2.4.6.jar:2.4.6]
        at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:48) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
        at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:42) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
        at scala.collection.immutable.List.foreach(List.scala:381) ~[scala-library-2.11.7.jar:na]
        at play.api.db.DefaultDBApi.connect(DefaultDBApi.scala:42) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
        at play.api.db.DBApiProvider.get$lzycompute(DBModule.scala:72) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
        at play.api.db.DBApiProvider.get(DBModule.scala:62) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
        at play.api.db.DBApiProvider.get(DBModule.scala:58) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
        at com.google.inject.internal.ProviderInternalFactory.provision(ProviderInternalFactory.java:81) ~[guice-4.0.jar:na]
    Caused by: play.api.Configuration$$anon$1: Configuration error[Exception during pool initialization]
        at play.api.Configuration$.configError(Configuration.scala:178) ~[play_2.11-2.4.6.jar:2.4.6]
        at play.api.PlayConfig.reportError(Configuration.scala:1048) ~[play_2.11-2.4.6.jar:2.4.6]
        at play.api.db.HikariCPConnectionPool.create(HikariCPModule.scala:69) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
        at play.api.db.PooledDatabase.createDataSource(Databases.scala:199) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
        at play.api.db.DefaultDatabase.dataSource$lzycompute(Databases.scala:124) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
        at play.api.db.DefaultDatabase.dataSource(Databases.scala:122) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
        at play.api.db.DefaultDatabase.getConnection(Databases.scala:143) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
        at play.api.db.DefaultDatabase.getConnection(Databases.scala:139) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
        at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:44) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
        at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:42) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
    Caused by: com.zaxxer.hikari.pool.PoolInitializationException: Exception during pool initialization
        at com.zaxxer.hikari.pool.BaseHikariPool.initializeConnections(BaseHikariPool.java:542) ~[HikariCP-2.3.7.jar:na]
        at com.zaxxer.hikari.pool.BaseHikariPool.<init>(BaseHikariPool.java:171) ~[HikariCP-2.3.7.jar:na]
        at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:60) ~[HikariCP-2.3.7.jar:na]
        at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:48) ~[HikariCP-2.3.7.jar:na]
        at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:80) ~[HikariCP-2.3.7.jar:na]
        at play.api.db.HikariCPConnectionPool$$anonfun$1.apply(HikariCPModule.scala:58) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
        at play.api.db.HikariCPConnectionPool$$anonfun$1.apply(HikariCPModule.scala:54) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
        at scala.util.Try$.apply(Try.scala:192) ~[scala-library-2.11.7.jar:na]
        at play.api.db.HikariCPConnectionPool.create(HikariCPModule.scala:54) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
        at play.api.db.PooledDatabase.createDataSource(Databases.scala:199) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
    Caused by: java.sql.SQLException: JDBC4 Connection.isValid() method not supported, connection test query must be configured
        at com.zaxxer.hikari.pool.BaseHikariPool.addConnection(BaseHikariPool.java:441) ~[HikariCP-2.3.7.jar:na]
        at com.zaxxer.hikari.pool.BaseHikariPool.initializeConnections(BaseHikariPool.java:540) ~[HikariCP-2.3.7.jar:na]
        at com.zaxxer.hikari.pool.BaseHikariPool.<init>(BaseHikariPool.java:171) ~[HikariCP-2.3.7.jar:na]
        at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:60) ~[HikariCP-2.3.7.jar:na]
        at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:48) ~[HikariCP-2.3.7.jar:na]
        at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:80) ~[HikariCP-2.3.7.jar:na]
        at play.api.db.HikariCPConnectionPool$$anonfun$1.apply(HikariCPModule.scala:58) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
        at play.api.db.HikariCPConnectionPool$$anonfun$1.apply(HikariCPModule.scala:54) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
        at scala.util.Try$.apply(Try.scala:192) ~[scala-library-2.11.7.jar:na]
        at play.api.db.HikariCPConnectionPool.create(HikariCPModule.scala:54) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
    

    ^请注意,我仔细检查了端口是否打开,复制粘贴的端点名称是否正确,端口号是否正确,数据库名称是否正确。我用Amazon RDS服务创建了Postgres实例,我100%确信这四件事是正确的。

    问题是什么(或者至少可以缩小到什么程度)?


    解决方案:将其添加到application.conf。。。

    #specify a connectionTestQuery. Only do this if upgrading the JDBC-Driver does not help
    db.default.hikaricp.connectionTestQuery="SELECT TRUE"
    

    或者升级到最新的驱动程序(不知道如何在SBT中实现)

    2 回复  |  直到 9 年前
        1
  •  0
  •   josephpconley    9 年前

    如果你阅读了stacktrace的底部(和Play’s Migration Guide ),您应该尝试添加connectionTestQuery,例如。

    db.default.connectionTestQuery = "select 1"
    
        2
  •  0
  •   Normandooak    9 年前

    伙计,我在应用程序中添加了这些命令。conf数据库.default.hikaricp。connectionTestQuery=“SELECT TRUE”,工作正常。