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

How to make Play 2 Scala work with remote PostgreSQL db server?

我的 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"

以下是播放失败的原因(在浏览器上)...

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>"

这是播放失败的方式(在终端中)...

--- (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: 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.apply(DefaultDBApi.scala:48) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
    at play.api.db.DefaultDBApi$$anonfun$connect.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: 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.apply(DefaultDBApi.scala:44) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
    at play.api.db.DefaultDBApi$$anonfun$connect.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.apply(HikariCPModule.scala:58) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
    at play.api.db.HikariCPConnectionPool$$anonfun.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.apply(HikariCPModule.scala:58) ~[play-jdbc_2.11-2.4.6.jar:2.4.6]
    at play.api.db.HikariCPConnectionPool$$anonfun.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 中执行此操作)

如果您阅读了堆栈跟踪的底部(以及 Play 的 Migration Guide),您应该尝试添加一个 connectionTestQuery,例如

db.default.connectionTestQuery = "select 1"

太棒了,伙计。我在 application.conf db.default.hikaricp.connectionTestQuery="SELECT TRUE" 上添加了这些命令并且工作正常。