JDBC连接可以远程工作,但不能在本地工作

时间:2017-05-26 07:48:25

标签: java mysql amazon-web-services jdbc amazon-ec2

我在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

  1. JDBC URL中的IP地址或主机名错误。

    • 不能在同一个网址上正常工作
  2. 本地DNS服务器无法识别JDBC URL中的主机名。

    • 我试过/127.0.0.1:3306/database,/ localhost:3306 / database,/ localhost / database,/ ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com:3306 / database,同样的错误,不管是什么
  3. JDBC URL中缺少或错误端口号。

    • 这是100%端口3306
  4. 数据库服务器已关闭。

    • 因为接受远程访问而未关闭
  5. 数据库服务器不接受TCP / IP连接。

    • 显然它确实接受,如果它适用于我的电脑
  6. 数据库服务器连接已用完。 - || -

  7. Java和DB之间的某些东西阻止了连接,例如防火墙或代理。

    • 入站规则为0.0.0.0,因此它应该同时适用于本地和远程
  8. 用户是“ec2-user”@“%”并且已授予所有权限,此用户应该适用于本地和远程用户吗?

    我完全无法尝试,我遇到的大多数情况都是人们让它在本地工作但不是远程工作。

    我可以通过telnet从实例linux命令行连接到localhost 3306:

    telnet localhost 3306 - Trying 127.0.0.1... Connected to localhost. Escape character is '^]'.
    

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

通过在单独的ec2-实例上运行mysql数据库来避免问题。 我想原来的设置没有答案,但是......现在可行了。