更新时间:2024-10-28 GMT+08:00

通过JDBC连接RDS for PostgreSQL实例

通过JDBC连接实例的方式有无需下载SSL证书连接和用户下载SSL证书连接两种,其中使用SSL证书连接通过了加密功能,具有更高的安全性。

前提条件

用户需要具备以下技能:

  • 熟悉计算机基础知识。
  • 了解java编程语言。
  • 了解JDBC基础知识。

驱动获取及使用

使用SSL证书连接

该方式属于SSL连接模式,需要下载SSL证书,通过证书校验并连接数据库。

您可以在“实例管理”页面,单击实例名称进入“概览”页面,单击“SSL”处的“下载”,下载根证书或捆绑包。

  1. 通过JDBC连接PostgreSQL数据库,代码中的JDBC连接格式如下:

    jdbc:postgresql://<instance_ip>:<instance_port>/<database_name>?sslmode=verify-ca&sslrootcert=<ca.pem>
    表1 参数说明

    参数

    说明

    <instance_ip>

    如果通过弹性云服务器连接,“instance_ip”是主机IP,即“概览”页面该实例的“内网地址”。

    如果通过连接了公网的设备访问,“instance_ip”为该实例已绑定的“弹性公网IP”。

    <instance_port>

    端口,默认5432,当前端口,参考“概览”页面该实例的“数据库端口”。

    <database_name>

    数据库名,即需要连接的数据库名(默认的管理数据库是postgres)。

    sslmode

    ssl连接模式。

    verify-ca:表示我想要对数据加密,并且我接受因此带来的负荷。我想要确保我连接到的是我信任的服务器。

    其他可选项请参考:https://jdbc.postgresql.org/documentation/use/#connection-parameters/

    sslrootcert

    ssl连接CA证书路径,参数详情请参考https://jdbc.postgresql.org/documentation/use/#connection-parameters/

    连接PostgreSQL数据库的java代码,可参考以下示例:

    // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。
    // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    
    public class MyConnTest {
    	final public static void main(String[] args) {
    		Connection conn = null;
    		// set sslmode here.
    		// with ssl certificate and path.
    		String url = "jdbc:postgresql://<instance_ip>:<instance_port>/<database_name>?sslmode=verify-ca&sslrootcert=/home/Ruby/ca.pem";
    		String userName = System.getenv("EXAMPLE_USERNAME_ENV");
    		String password = System.getenv("EXAMPLE_PASSWORD_ENV");
    
    		try {
    			Class.forName("org.postgresql.Driver");
    			conn = DriverManager.getConnection(url, userName, password);
    			System.out.println("Database connected");
    
    			Statement stmt = conn.createStatement();
    			ResultSet rs = stmt.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");
    			while (rs.next()) {
    				System.out.println(rs.getString(1));
    			}
    
    			rs.close();
    			stmt.close();
    			conn.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    			System.out.println("Test failed");
    		} finally {
    			// release resource ....
    		}
    	}
    }

无证书连接

该方式属于SSL连接模式,但不对服务端进行证书校验,用户无需下载SSL证书。

  1. 通过JDBC连接RDS for PostgreSQL数据库实例,代码中的JDBC连接格式如下:

    jdbc:postgresql://<instance_ip>:<instance_port>/<database_name>?sslmode=disable
    表2 参数说明

    参数

    说明

    <instance_ip>

    如果通过弹性云服务器连接,“instance_ip”是主机IP,即“概览”页面该实例的“内网地址”。

    如果通过连接了公网的设备访问,“instance_ip”为该实例已绑定的“弹性公网IP”。

    <instance_port>

    端口,默认5432,当前端口,参考“概览”页面该实例的“数据库端口”。

    <database_name>

    数据库名,即需要连接的数据库名(默认的管理数据库是postgres)。

    sslmode

    ssl连接模式。

    disable:表示我不关心安全性,也不想为加密支付开销。

    其他可选项请参考:https://jdbc.postgresql.org/documentation/use/#connection-parameters/

    连接PostgreSQL数据库的java代码,可参考以下示例:

    // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全。
    // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    
    public class MyConnTest {
    	final public static void main(String[] args) {
    		Connection conn = null;
    		// set sslmode here.
    		// no ssl certificate, so do not specify path.
    		String url = "jdbc:postgresql://<instance_ip>:<instance_port>/<database_name>?sslmode=disable";
                    String userName = System.getenv("EXAMPLE_USERNAME_ENV");
    		String password = System.getenv("EXAMPLE_PASSWORD_ENV");
    		try {
    			Class.forName("org.postgresql.Driver");
    			conn = DriverManager.getConnection(url, userName, password);
    			System.out.println("Database connected");
    
    			Statement stmt = conn.createStatement();
    			ResultSet rs = stmt.executeQuery("SELECT * FROM mytable WHERE columnfoo = 500");
    			while (rs.next()) {
    				System.out.println(rs.getString(1));
    			}
    			rs.close();
    			stmt.close();
    			conn.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    			System.out.println("Test failed");
    		} finally {
    			// release resource ....
    		}
    	}
    }