通过 Java 连接到 Amazon EC2 上的 PostgreSQL

Connecting to PostgreSQL on Amazon EC2 through Java

我想连接到 java 中的 PostgreSQL 数据库,该数据库位于 Amazon EC2 上。 我可以使用 Mac 上名为 Postico 的 postgres 客户端连接到它。 我指定下一个信息:

  1. 昵称

  2. 主机(ec2-xx-xx-xx-xx.xx-xx-x.compute.amazonaws.com)

  3. 用户

  4. 密码

  5. 数据库名称

  6. SSH 主机

  7. 用户

  8. 密码 - 空白

  9. 私钥 - .pem 文件

我在 Java 中找不到有关如何连接它的任何示例。 我找到了一些 RedshiftJDBC 驱动程序并将其添加到项目中。 比我试过这个:

try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException e) {
            System.out.println("Where is your MySQL JDBC Driver?");
            e.printStackTrace();
            return;
        }
        System.out.println("MySQL JDBC Driver Registered!");
        try {
            this.connection = DriverManager.getConnection("jdbc:postgresql://" +DNS+"/"+myDBname, MYSQLUSER, MYSQLPW);
        } catch (SQLException e) {
            System.out.println("Connection Failed! Check output console");
            e.printStackTrace();
        }

        if (connection != null) {
            System.out.println("You made it, take control your database now!");
        } else {
            System.out.println("Failed to make connection!");
        }

我知道这行不通,但至少我试过了)) 我不知道如何在请求中指定私钥(如何发送)或其他任何内容。 有人可以帮我吗? 谢谢。

从 Java 连接时,您没有指定 SSH 信息(SSH 主机、私钥等)。 JDBC 驱动程序希望能够直接连接到数据库服务器并且不支持 SSH 隧道。如果您需要使用 SSH 隧道,那么您应该在启动 Java 应用程序之前单独创建该连接。

如果 Java 应用程序 运行ning 在 AWS 上,那么您应该能够配置网络以允许直接连接。如果您在本地测试 Java 应用程序并需要连接到远程数据库,那么您 运行 在本地先使用 ssh 命令打开隧道。请参阅此文档:http://www.postgresql.org/docs/8.2/static/ssh-tunnels.html or this answer: PostgreSQL via SSH Tunnel

使用 PostgreSQL JDBC 驱动程序尝试以下代码。您想让代码更具弹性(例如,在连接和发送查询之间检查数据库是否为 null 等),但这应该让您继续。

private final String DB_HOST = "YOUR_EC2_HOSTNAME";
private final String DB_PORT = "5432";
private final String DB_USER = "YOUR_POSTGRES_USERNAME";
private final String DB_PASSWD = "YOUR_POSTGRES_PASSWORD";
private final String DB_NAME = "YOUR_POSTGRES_DBNAME";
private final String DB_URL = "jdbc:postgresql://" + DB_HOST + ":" + DB_PORT + "/" + DB_NAME;

private final String INSERT = "INSERT INTO articles (date, name, uuid) VALUES (?, ?, ?)";
private Connection db = null;

public PostgreSQLService() {
    try {
        Class.forName("org.postgresql.Driver");
        db = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWD);
    } catch (ClassNotFoundException | SQLException ex) {
        log.error(ex);
    }

    try (PreparedStatement st = db.prepareStatement(INSERT)) {
        st.setEscapeProcessing(false);

        st.setDate(1, new java.sql.Date(DateUtil.getToday().getTime()));
        st.setString(2, "YOUR_NAME");
        st.setObject(3, UUID.randomUUID());

        if (st.executeUpdate() <= 0) {
            throw new PostgreSQLServiceException("0 rows inserted while trying to insert a new row ::: " + st.toString());
        }

    } catch (SQLException sqle) {
        throw new PostgreSQLServiceException("Received an SQLException trying to insert a row", sqle);
    }
}

Maven 依赖项是:

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.4.1208</version>
</dependency>

请注意,如果您从 AWS 外部执行此代码,则需要在该 EC2 实例的安全组中打开端口 5432。

我还建议查看 Amazon RDS。您可以使用上面的代码连接到它,就像 EC2 上的 Postgres 实例 运行 一样。

希望对您有所帮助!