播放无法连接到(PostgreSQL)数据库[​​默认]

时间:2015-12-16 23:04:50

标签: database postgresql playframework

我正在

CreationException: Unable to create injector, see the following errors: 
1) Error in custom provider, Configuration error: Configuration error[Cannot connect to database [default]]
[...]
2) Error in custom provider, Configuration error: Configuration error[Cannot connect to database [default]]

最初我使用了与Play Framework应用程序一起工作的MySQL数据库,但是我想把它改成PostgreSQL,那就是问题开始出现的时候。我已经在我的Ubuntu计算机上安装了它们并更改了播放配置以使用Postgres(将"postgresql" % "postgresql" % "9.1-901-1.jdbc4",添加到build.sbt并将db.default属性更改为引用Postgres)。确切的application.conf是:

db.default.driver="org.postgresql.Driver"
db.default.url="jdbc:postgres://localhost:5432/playdb"
db.default.username="luka"
db.default.password="test"

我手动创建了用户密码测试和数据库playdb的用户luka。我也试过postgres用户,但没有用。

更让我感到困惑的是,MySQL现在无法使用相同的错误。我创建了新项目,只修改了conf中的db.default参数,它以相同的方式失败。评论application.conf会让它消失,所以这肯定是问题所在。我检查了PostgreSQL日志(/var/log/postgresql/postgresql-9.4-main.log),只有[unknown]@[unknown] LOG: invalid length of startup packet的行似乎不正确。它出现多次,但不是每次我刷新项目(我甚至不确定它是否相关)。我已从我的电脑中删除了mysql-server,希望一切都能神奇地修复自己。它没有。

想法?

我正在使用Play 2. 4. 6和IntelliJ IDEA 15.使用Activator创建项目并将源导入IDEA(使用SBT模型)。

编辑我在向db.default.hikaricp.connectionTestQuery = "SELECT 1"添加application.conf时也遇到了错误。

4 个答案:

答案 0 :(得分:12)

所以,明确的答案是:

首先,数据库网址存在错误,db.default.url="jdbc:postgresql://localhost:5432/playdb"应为chabeee pointed out。这是db.default.url唯一正确的格式(所以没有jdbc:postgresql://username:pasword:localhost/dbname或类似的格式,正如我在其他地方所建议的那样)。

其次,更棘手的是,驱动程序中存在Salem pointed out错误,解决方法是将db.default.hikaricp.connectionTestQuery = "SELECT 1"添加到application.conf
但是,在比9.1-903更新的版本中,该错误已得到修复(嗯,已实施该解决方法)。问题是,在版本9.1-901之后,postgresql在repos中更改了它的groupID,现在它由org.postgresql引用。比解决方法更好的解决方案是将依赖关系更新为"org.postgresql" % "postgresql" % "9.4-1206-jdbc4"current versionMVNrepository)。将适当的jdbc版本附加到最新的PostgreSQL驱动程序(Java {1 4,Java 7 41,Java 8 42。“

我的最终application.conf

db.default.driver="org.postgresql.Driver"
db.default.url="jdbc:postgresql://localhost/playdb" #the port is optional
db.default.username="luka"
db.default.password="test"

libraryDependencies中的build.sbt

libraryDependencies ++= Seq(
  jdbc,
  "org.postgresql" % "postgresql" % "9.4-1206-jdbc42",
  cache,
  javaWs
)

2017年更新: 我现在才注意到,在写完这个答案后不久,他们改变了版本控制方案并删除了-jdbc [code]片段,将其替换为.jre6,.jre7或者什么都没有,显然意味着它适用于最新的Java版本(我没有发现支持这种说法的任何东西,但它确实有效)。然而在2017年2月他们再次changed the version scheme again并从主要版本9跳到42,使当前版本(截至2017年7月17日)由"org.postgresql" % "postgresql" % "42.1.3"表示(或相应地,"org.postgresql" % "postgresql" % "42.1.3.jre7" / { {1}})

答案 1 :(得分:1)

来自你的堆栈跟踪

  

不支持JDBC4 Connection.isValid()方法,必须配置连接测试查询

基本上这是您的驱动程序的问题(它不支持该方法),但您应该能够解决它在application.conf中指定测试查询:

play.db.default.hikaricp.connectionTestQuery = "SELECT 1"

答案 2 :(得分:1)

尝试替换此行:

db.default.url="jdbc:postgres://localhost:5432/playdb"

到此:

db.default.url="jdbc:postgresql://localhost:5432/playdb"

希望,这有帮助。

答案 3 :(得分:0)

您是否有机会在Mac上,并且您的/Library/Java/Extensions目录中是否有postgresql .jar文件?

编辑抱歉,我是新人。我遇到了不支持" JDBC4 Connection.isValid()方法"在我的Mac上使用Hikari时的消息,我通过在该扩展目录中找到并删除JDBC3 .jar文件来解决它。我不知道它是如何到达那里的(可能在我安装PostgreSQL或一些相关工具时)但我发现它会被加载而不是我的类路径上的任何JDBC4 .jar文件。也许在Ubuntu中发生了类似的事情。可能值得检查,因为除了" isValid()"之外还可能出现与JDBC4相关的其他问题。