2009年5月4日星期一

JavaEEDesign_011:数据层(持久化层)面临的四大问题之一:主键的生成(摘录+整理)

1. 主键生成策略有哪些?
(1)使用数据库触发器自动产生主键。
(2)使用自动递增列自动产生主键,适用于MySQL、SQL Server。
(3)使用顺序产生器自动产生主键,然后插入表中,适用于Oracle。
(4)使用Java类或EJB,维护顺序号,缓存这些顺序号,使用者按顺序取得顺序号,使用完毕后更新表中的计数值。

2. 优劣比较
(1)(2)无法返回生成的主键,需要再使用一条语句查询。当然,使用 JDBC Statement 的特性可以提前返回生成的主键,使用方法如下:
pstmt=conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS );
ResultSet rsKey=pstmt.getGeneratedKeys();
rsKey.next();
int rootid=rsKey.getInt(1);

(3)可以返回
生成的主键,但(1)(2)(3)共同的缺点是可移植性差,改换数据库后,要改动很多地方。(4)独立于数据库,但使用时也有要注意的地方:
  • 集群环境中如何保持主键的唯一性。
  • 如果Server突然down掉,会造成缓存的主键丢失,重新启动后,会有一段主键是“空白的”。这种情况虽然不是大毛病,但数据库管理员也许不会接受。
  • 其它直接访问数据库(不通过方法(4))的程序,会造成主键顺序混乱。
3. 该选择哪一种呢?选择哪一种,可以根据实际情况决定,以下是三个建议供参考:
(1)由单一的服务点提供主键的生成。
(2)主键的使用者与主键的生成机制分离。
(3)如果做不到独立于数据库,至少要将数据库特性隐藏起来,这样即使要改主键生成机制,至少不用改动主键的使用者:DAO。

没有评论: