无法连接到(PostgreSQL)数据库 [default] 的Play问题

6
我正在获得。
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]]

最初我使用MySQL数据库与Play Framework应用程序配合使用,能够正常工作,但是我想将其更改为PostgreSQL,于是问题开始出现。我在Ubuntu电脑上安装了它们两个,并更改了play配置以使用Postgres(在build.sbt中添加了"postgresql"%"postgresql"%"9.1-901-1.jdbc4",并将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"

我手动创建了用户名为luka,密码为test和数据库playdb的用户。我尝试使用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个回答

13

所以,确定的答案是:

首先,在数据库url中有一个错误,应该是 db.default.url="jdbc:postgresql://localhost:5432/playdb",正如chabeee指出的。这是唯一正确格式的 db.default.url (因此不要使用类似于jdbc:postgresql://username:pasword:localhost/dbname之类的格式,在其他地方也看到过建议使用这种格式)。

其次,更加棘手的问题是,有一个驱动程序中存在着一个bug,就像Salem指出的那样,解决方法是在application.conf中添加db.default.hikaricp.connectionTestQuery = "SELECT 1"
然而,这个bug已经在比 9.1-903 版本更新的版本中修复了(或者说实现了这个解决办法)。问题在于,版本号大于 9.1-901 的PostgreSQL将其groupID改为了org.postgresql。更好的解决办法是将依赖项更新到"org.postgresql"%"postgresql"%"9.4-1206-jdbc4"当前版本MVNrepository)。将适当的jdbc版本附加到最新的PostgreSQL驱动程序上(对于Java 6,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"

build.sbt 中的 libraryDependencies

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

2017年更新:我现在才注意到,就在回答这个问题不久之后,他们更改了版本控制方案,删除了“-jdbc [code]”片段,用“.jre6”、“。jre7”或无任何替换它,显然是针对最新的Java版本(我还没有找到任何支持这一说法的东西,但它可以工作)。 2017年2月,他们再次更改了版本控制方案,从主版本9跳到42,这使得当前版本(截至2017年7月17日)用"org.postgresql"%"postgresql"%"42.1.3"表示(或者相应地,"org.postgresql"%"postgresql"%"42.1.3.jre7" / "org.postgresql"%"postgresql"%"42.1.3.jre6")。


解决方法(关于你提到的错误)使其正常运行。谢谢! - Silas

1

从您的堆栈跟踪中可以看出

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

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

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

这确实解决了原始错误,但是它创建了一个新的错误:play.db.default 的类型为 OBJECT 而不是 STRING(我检查了那一行)。 - Luke
@Luke尝试使用db.default.hikaricp.connectionTestQuery = "SELECT 1"代替。 - Salem
我也尝试过了。起初我以为它会出现相同的错误,但是现在堆栈跟踪不同了:http://hastebin.com/hazoraradi.txt - Luke

1

尝试替换这行:

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

转换为:

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

希望它有所帮助。

1
我的 db.default.url 已经是 jdbc:postgres://localhost:5432/playdb - Luke
将其更改为PostgreSQL,因此您缺少'q'和'l'字符。 - chabeee
这实际上解决了问题,但也需要应用Salem的解决方法。我发誓我只是复制粘贴了那部分内容,没有想到它会不准确。 - Luke

0

你是否在使用Mac电脑,并且在/Library/Java/Extensions目录下有一个postgresql .jar文件?

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


这更像是对问题的评论,而不是答案。 - slfan
是的,注释用于请求澄清,答案应该回答问题,而不是提出更多问题。但是为了回答你的问题,不,我正在使用Ubuntu(并且已经解决了这个问题)。 - Luke
@Luke,很遗憾那对我没用。我以为还有其他的解决办法。 - Serendipity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接