You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Java Lambda连接RDS Postgres数据库的代码示例及配置指南

pom.xml 依赖配置
<dependencies>
    <!-- AWS Lambda核心依赖 -->
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-core</artifactId>
        <version>1.2.21</version>
    </dependency>
    <!-- PostgreSQL JDBC驱动 -->
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.6.0</version>
    </dependency>
    <!-- 可选:如果从AWS Secrets Manager动态拉取凭据,添加以下两个依赖 -->
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-secretsmanager</artifactId>
        <version>1.12.510</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.15.2</version>
    </dependency>
</dependencies>
无服务器连接PostgreSQL前置配置
  • Lambda执行角色必须绑定AWSLambdaVPCAccessExecutionRole托管策略,确保Lambda可以访问PostgreSQL集群所在的VPC、子网资源
  • PostgreSQL所在安全组需要放行Lambda安全组的5432端口入站流量
  • 数据库连接初始化放在静态代码块中,复用Lambda执行环境的复用特性,避免每次请求都新建连接,降低冷启动开销
  • 禁止硬编码数据库凭据,建议将凭据存储在AWS Secrets Manager中,运行时动态获取
Java Lambda代码示例
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import java.sql.*;
import java.util.*;

public class PostgresLambdaHandler implements RequestHandler<Map<String, Object>, Object> {
    // 静态连接对象,复用执行环境的连接,仅冷启动时初始化一次
    private static Connection connection;

    static {
        try {
            Class.forName("org.postgresql.Driver");
            // 连接URL格式:jdbc:postgresql://<集群端点>:5432/<DB名称>
            // 集群端点可在AWS RDS控制台对应集群详情页获取,和你持有的集群标识符对应
            String dbUrl = "jdbc:postgresql://你的Postgres集群端点:5432/你的DB名称";
            // 此处仅为示例,生产环境请从Secrets Manager拉取账号密码
            String username = "你的数据库账号";
            String password = "你的数据库密码";
            connection = DriverManager.getConnection(dbUrl, username, password);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("数据库连接初始化失败: " + e.getMessage());
        }
    }

    @Override
    public Object handleRequest(Map<String, Object> input, Context context) {
        String operation = (String) input.get("operation");
        try {
            if ("query".equals(operation)) {
                return queryData((String) input.get("queryParam"));
            } else if ("insert".equals(operation)) {
                return insertData((Map<String, Object>) input.get("insertData"));
            } else {
                return Collections.singletonMap("error", "不支持的操作类型");
            }
        } catch (SQLException e) {
            context.getLogger().log("数据库操作异常: " + e.getMessage());
            return Collections.singletonMap("error", "数据库操作失败: " + e.getMessage());
        }
    }

    // 查询操作示例
    private List<Map<String, Object>> queryData(String param) throws SQLException {
        List<Map<String, Object>> resultList = new ArrayList<>();
        // 替换为实际业务表名和查询条件
        String sql = "SELECT id, name, create_time FROM your_table WHERE condition = ?";
        try (PreparedStatement pstmt = connection.prepareStatement(sql)) {
            pstmt.setString(1, param);
            ResultSet rs = pstmt.executeQuery();
            ResultSetMetaData metaData = rs.getMetaData();
            int columnCount = metaData.getColumnCount();
            while (rs.next()) {
                Map<String, Object> row = new HashMap<>();
                for (int i = 1; i <= columnCount; i++) {
                    row.put(metaData.getColumnName(i), rs.getObject(i));
                }
                resultList.add(row);
            }
        }
        return resultList;
    }

    // 插入操作示例
    private Map<String, Object> insertData(Map<String, Object> data) throws SQLException {
        // 替换为实际业务表名和插入字段
        String sql = "INSERT INTO your_table(name, value) VALUES (?, ?) RETURNING id";
        try (PreparedStatement pstmt = connection.prepareStatement(sql)) {
            pstmt.setString(1, (String) data.get("name"));
            pstmt.setString(2, (String) data.get("value"));
            ResultSet rs = pstmt.executeQuery();
            if (rs.next()) {
                return Collections.singletonMap("insertedId", rs.getInt(1));
            }
        }
        return Collections.singletonMap("status", "插入失败");
    }
}
补充说明
  • 如果使用RDS Proxy做连接池管理,只需将连接URL替换为RDS Proxy的端点即可,进一步降低连接数占用,避免数据库连接溢出
  • Lambda超时时间建议设置在10秒以上,预留足够的数据库连接初始化时间
  • 执行异常时的日志可在CloudWatch控制台查询,用于定位连接、权限、语法等问题

内容的提问来源于stack exchange,提问作者intelviji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:36:02