使用 Java 和 Aurora DSQL 的无服务器应用程序 - 第5部分:添加对标识列和序列对象的支持
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 文档中的 sequences 和 identity 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 的示例进行对比。