通过 Java 连接到 Amazon EC2 上的 PostgreSQL
Connecting to PostgreSQL on Amazon EC2 through Java
我想连接到 java 中的 PostgreSQL 数据库,该数据库位于 Amazon EC2 上。
我可以使用 Mac 上名为 Postico 的 postgres 客户端连接到它。
我指定下一个信息:
昵称
主机(ec2-xx-xx-xx-xx.xx-xx-x.compute.amazonaws.com)
用户
密码
数据库名称
SSH 主机
用户
密码 - 空白
私钥 - .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 实例 运行 一样。
希望对您有所帮助!
我想连接到 java 中的 PostgreSQL 数据库,该数据库位于 Amazon EC2 上。 我可以使用 Mac 上名为 Postico 的 postgres 客户端连接到它。 我指定下一个信息:
昵称
主机(ec2-xx-xx-xx-xx.xx-xx-x.compute.amazonaws.com)
用户
密码
数据库名称
SSH 主机
用户
密码 - 空白
私钥 - .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 实例 运行 一样。
希望对您有所帮助!