使用 Java 和 Aurora DSQL 的无服务器应用程序 - 第5部分:添加对标识列和序列对象的支持

发布: (2026年2月26日 GMT+8 23:58)
3 分钟阅读
原文: Dev.to

Source: Dev.to

介绍

最近,AWS 在 Aurora DSQL 中加入了对 identity 列sequence 对象 的支持。这使得开发者可以直接在数据库中使用熟悉的 SQL 模式生成自增的整数 ID。

对于许多工作负载来说,短数字 ID 比 UUID(甚至是时间顺序的 UUIDv7)更受欢迎。数字 ID 更容易口头交流(例如订单号),且比 36 字符的 UUID 字符串表示更紧凑。

该新特性简化了现有 PostgreSQL 应用的迁移,并支持依赖数据库管理的整数标识符的新工作负载。开发者现在可以创建紧凑、易读的 ID,如订单号、账户 ID 或业务引用,而无需在应用代码或中间件中编写自定义 ID 生成逻辑。

Aurora DSQL 对 identity 列和 sequence 对象的支持已在所有提供 Aurora DSQL 的地区上线。有关更多细节,请参阅 Aurora DSQL 文档中的 sequencesidentity columns

在示例应用中使用 Sequence

下面提供了两个最小的 Java 25 示例,演示如何在 Aurora DSQL 中使用 PostgreSQL sequence(product_id)。两个应用都使用 AWS SAM 部署,并使用 HikariCP 进行连接池管理。

创建 Sequence

CREATE SEQUENCE product_id CACHE 1;

1️⃣ Plain JDBC 示例(无框架)

此示例使用原生 JDBC(不使用 Spring、Hibernate)。产品 ID 通过从 product_id sequence 中获取下一个值来生成。

public int createProduct(Product product) throws Exception {
    try (var pst1 = this.generateProductId(con);
         var rs = pst1.executeQuery()) {
        if (rs.next()) {
            var id = rs.getInt("nextval");
            // assign id to product, insert product row, etc.
        }
        // ...
    }
}

private PreparedStatement generateProductId(Connection con) throws SQLException {
    return con.prepareStatement("SELECT nextval('product_id')");
}

2️⃣ Hibernate ORM 示例

在此版本中,实体使用 JPA 注解映射到同一个 product_id sequence。

@Entity
@Table(name = "products")
public class Product implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(sequenceName = "product_id", allocationSize = 1)
    private int id;

    // other fields, getters, setters...
}

DAO 使用 SessionFactory 来持久化和检索 Product 实体:

public class ProductDao {

    private static final SessionFactory sessionFactory = HibernateUtils.getSessionFactory();

    public int createProduct(Product product) throws Exception {
        var session = sessionFactory.openSession();
        var transaction = session.beginTransaction();
        session.persist(product);
        transaction.commit();
        return product.getId();
    }

    public Optional getProductById(int id) throws Exception {
        var session = sessionFactory.openSession();
        return Optional.ofNullable(session.find(Product.class, id));
    }
}

后续步骤

  • 将本系列前几部分的示例应用更新为使用 sequence 支持。
  • 对使用 Java 运行时(托管)与 GraalVM 本地镜像的 Lambda 函数进行性能基准测试。
  • 将结果与原始基于 DynamoDB 的示例进行对比。
0 浏览
Back to Blog

相关文章

阅读更多 »