【问题标题】:My own database autoincrement - Avoid duplicated keys我自己的数据库自动增量 - 避免重复键
【发布时间】:2017-04-26 22:19:55
【问题描述】:

我有一个 Java EE Web 应用程序和一个 SQL Server 数据库。 我打算稍后对我的数据库进行集群。

现在,我有两张桌子: - 用户 - 地点

但我不想使用 SQL Server 的自动 ID。 由于集群,我想生成自己的 id。

所以,我创建了一个新表Parameter。参数表有两列:TableNameLastId。我的参数表存储了最后一个 id。当我添加一个新用户时,我的方法 addUser 这样做:

  • 查询参数表的最后一个id,递增+1;
  • 插入新用户
  • 更新最后一个 id +1。

它正在工作。但它是一个 Web 应用程序,那么同时 1000 人怎么样?也许他们中的一些人得到相同的最后一个ID。我该如何解决这个问题?我尝试过同步,但它不起作用。

你有什么建议?是的,我必须避免自动递增。

我知道用户必须等待。

【问题讨论】:

  • 好吧,唯一的方法就是同步或使用自动增量。
  • 您可以使用 GUID 代替密钥吗?数据库并不总是必须是密钥的来源。请注意,在参照完整性方面,GUID 并不总是那么方便 - 与整数相比,您携带的键相当大。

标签: sql-server jakarta-ee auto-increment


【解决方案1】:

自动 ID 可能在集群中工作得更好,但如果您想成为数据库可移植或自己实现分配器,基本方法是在乐观循环中工作。

我更喜欢“下一个 ID”,因为它使逻辑更清晰,所以我将在本例中使用它。

  1. 从分配器表中选择 NextID。
  2. UPDATE NextID SET NextID=NextID+Increment WHERE NextID=您读取的值
  3. 在 RowsAffected != 1 时循环。

当然,您还可以在选择/更新时使用 TableName 条件来选择适当的分配器行。

您还应该查看以块为单位进行分配——比如 Increment=200——并将它们缓存在应用服务器中。这将提供更好的并发性并且比每次访问数据库要快得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2020-04-22
    相关资源
    最近更新 更多