Play Framework 2.3 - 无法连接到远程数据库 Linux (Play) -> Win 7 (MySQL)
Posted
技术标签:
【中文标题】Play Framework 2.3 - 无法连接到远程数据库 Linux (Play) -> Win 7 (MySQL)【英文标题】:Play Framework 2.3 - Can't connect to remote database Linux (Play) -> Win 7 (MySQL) 【发布时间】:2015-04-16 14:53:11 【问题描述】:我有一台 Linux 机器(在 10.0.0.10
上),我部署了我的 Play 应用程序来使用它:
activator dist
我有一台运行 mysql 的 Windows 机器(10.0.0.51
)。
数据库设置了3个用户账号root@localhost
、db_user@localhost
、db_user@%
所有用户都拥有所有权限(仅供测试)。
我可以使用mysql
shell 从 Linux 机器访问数据库:
[neil@localhost ~]$ mysql -u db_user -p -h 10.0.0.51
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.12 MySQL Community Server (GPL)
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| test_db |
| mysql |
| performance_schema |
| sakila |
| test |
| world |
+--------------------+
8 rows in set (0.04 sec)
mysql>
test_db
是我在 Windows 机器上设置的测试数据库。
但是,当我尝试运行 Play 应用程序时,我得到以下信息:
[neil@localhost ~]$ ~/TEST_APP-1.0-SNAPSHOT/bin/test_app
Play server process ID is 5908
[error] c.j.b.h.AbstractConnectionHook - Failed to obtain initial
connection Sleeping for 0ms and trying again. Attempts left: 0.
Exception: java.net.ConnectException: Connection
refused.Message:Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago.
The driver has not received any packets from the server.
Oops, cannot start the server.
Configuration error: Configuration error[Cannot connect to database
[db_user]]
at play.api.Configuration$.play$api$Configuration$$configError
(Configuration.scala:94)
...
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:
Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago.
The driver has not received any packets from the server.
...
这是我的 application.conf 中的数据库配置:
db.db_user.driver=com.mysql.jdbc.Driver
db.db_user.url="jdbc:mysql://10.0.0.51:3306/test_db?allowMultiQueries=true"
db.db_user.user=db_user
db.db_user.pass="password"
db.db_user.partitionCount=3
db.db_user.maxConnectionsPerPartition=20
db.db_user.minConnectionsPerPartition=5
db.db_user.acquireIncrement=5
值得注意的是,当我在 Windows 上以开发模式运行应用程序时,此配置有效。但是我不知道 Linux 机器上出了什么问题,而且我已经没有东西可以尝试了。 (请注意,我在关闭所有防火墙的情况下尝试了此操作并遇到了同样的问题)。
更新
在我使用的播放应用程序中:
public static final String DB_USER = "db_user";
...
JdbcTemplate jt = new JdbcTemplate(DB.getDataSource(DB_USER));
所以我不应该在 conf 中使用 db.default.etc...
吗?这不正确吗?
更新 2
我不知道我是怎么错过的,但是堆栈跟踪中还有一些其他的东西表明了问题(堆栈跟踪很长,所以我不想列出整个事情,也许我应该有):
Caused by: java.net.ConnectException: Connection refused
所以...服务器正在侦听端口 3306,在运行 netstat -an
的 Windows 服务器上产生:
TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING
TCP [::]:3306 [::]:0 LISTENING
防火墙已关闭(我知道……只是为了测试)。
MySQL 正在接受来自 CLI 的连接。
不过,我刚刚有一个脑电波...... application.conf 是在 Windows 上生成的......我想知道我是否需要在配置文件上运行 dos2unix
,这就是它找不到 @987654338 的原因@。
更新 3
没有:(
【问题讨论】:
尝试在整个配置中将db.db_user
替换为db.default
。
我得到了基于"db_user"
的数据源,所以这应该不是问题吧?查看我的更新。
【参考方案1】:
你需要在conf中使用db.default
。
from JavaDatabase
【讨论】:
会员 4 天,已经给出了答案...... goooooood!不过,您应该链接文档的最新版本。【参考方案2】:我认为指定密码的正确密钥不是pass
,而是password
:
db.db_user.password="password"
您也可以尝试使用db.default.*
和DB.getDataSource()
,但我想这不会有太大区别...
【讨论】:
有趣......看起来你是对的,但这从未停止过它的工作(当我在 Windows 上本地运行数据库和服务器时)。唉,它没有解决问题,我认为我的问题是我的 Play 服务器甚至看不到数据库(java.net.ConnectException: Connection refused
),但我完全不知道为什么;我可以从命令行连接。
BTW db_user 在db.db_user.user=db_user
应该被引用。尝试将logger.com.jolbox=DEBUG
添加到您的application.conf
以查看您是否在控制台中获得更多信息
我添加了该配置选项,但它没有效果,我也没有看到用户名需要在文档playframework.com/documentation/2.3.x/SettingsJDBC 的引号中,但我都尝试了,但没有改变
@Neilos 你解决了吗?我遇到了类似的问题,我无法从部署在另一个公共云上的应用程序访问安装在单独公共云上的 mysql 数据库。我可以从 mysql 工作台访问数据库,但应用程序无法看到它。请分享您用来解决此问题的任何观察结果!
@user1242321 我刚刚使用我的本地计算机作为播放服务器(Play 2.4)安装了一个带有 Mysql 的 VM(这是我之前遇到的问题),它现在可以工作了。所以我没有任何问题,我想说的是确保您的用户有权从您的服务器访问,试试我使用的例如:GRANT ALL PRIVILEGES ON my_database.* TO 'my_user'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
但这仅适用于开发人员,我将改进生产权限! 以上是关于Play Framework 2.3 - 无法连接到远程数据库 Linux (Play) -> Win 7 (MySQL)的主要内容,如果未能解决你的问题,请参考以下文章
Play Framework 2.3 和 javascript websocket 客户端库
如何在 Play Framework 2.3 中向 FakeRequest 添加查询字符串参数?