我在amazon t1.micro ec2 Linux实例中运行了一个MySQL数据库。
我使用数据源,因此我可以进行连接池,代码在我的家用电脑上工作正常,但在实例上运行相同的代码时出现通信链接错误。
DataSource.java看起来像这样:
package resources;
import org.apache.commons.dbcp2.BasicDataSource;
public class DataSource {
private static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
private static final String DB_URL = "jdbc:mysql://ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com:3306/database";
private static final String DB_USER = "ec2-user";
private static final String DB_PASSWORD = "root";
private static final int CONN_POOL_SIZE = 50;
private BasicDataSource bds = new BasicDataSource();
private DataSource() {
bds.setDriverClassName(DRIVER_CLASS_NAME);
bds.setUrl(DB_URL);
bds.setUsername(DB_USER);
bds.setPassword(DB_PASSWORD);
bds.setInitialSize(CONN_POOL_SIZE);
}
然后我有一个球衣休息地址,它会像这样画出一个连接:
source = DataSource.getInstance().getBds();
connection = source.getConnection();
当我在自己的电脑上运行项目时,没有错误,它正确地获取数据。我可以通过命令行和JDBC代码远程连接到数据库。但是当我在亚马逊实例上运行/部署完全相同的代码时,我得到了这个错误跟踪:
java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure
Last packet sent to the server was 0 ms ago.)
[lower down]
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
Last packet sent to the server was 0 ms ago.
显然,当ec2-user @ localhost尝试连接时,数据库不可用。
my.cnf的内容是:my.cnf
我试过搞乱绑定地址,将其设置为127.0.0.1并将其注释掉。
我可以使用“mysql -u ec2-user -p root”和“mysql -h localhost -u ec2-user -p root”从linux命令行打开mysql。我确认服务器实际上是在3306端口上运行。
在我的亚马逊实例安全组中,我有以下入站规则: https://i.stack.imgur.com/la0q2.png
我完成了这篇文章中的步骤: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
JDBC URL中的IP地址或主机名错误。
本地DNS服务器无法识别JDBC URL中的主机名。
JDBC URL中缺少或错误端口号。
数据库服务器已关闭。
数据库服务器不接受TCP / IP连接。
数据库服务器连接已用完。 - || -
Java和DB之间的某些东西阻止了连接,例如防火墙或代理。
用户是“ec2-user”@“%”并且已授予所有权限,此用户应该适用于本地和远程用户吗?
我完全无法尝试,我遇到的大多数情况都是人们让它在本地工作但不是远程工作。
我可以通过telnet从实例linux命令行连接到localhost 3306:
telnet localhost 3306 - Trying 127.0.0.1... Connected to localhost. Escape character is '^]'.
答案 0 :(得分:0)
答案 1 :(得分:0)
通过在单独的ec2-实例上运行mysql数据库来避免问题。 我想原来的设置没有答案,但是......现在可行了。