繁体   English   中英

通过Java连接到Amazon EC2上的PostgreSQL

[英]Connecting to PostgreSQL on Amazon EC2 through Java

我想连接到Amazon EC2上的Java中的PostgreSQL数据库。 我可以使用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!");
        }

我知道它不起作用,但至少我尝试过))我不知道如何在请求中指定私钥(如何发送),或其他任何方法。 有人可以帮我吗? 谢谢。

使用PostgreSQL JDBC驱动程序尝试以下代码。 您想使代码更具弹性(例如,在连接和发送查询之间检查db中是否为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实例一样。

我希望这有帮助!

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM