我自己的数据库自动增量 - 避免重复的密钥

时间:2016-12-12 04:33:44

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

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

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

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

所以,我已经创建了一个新表Parameter。参数表有两列:TableNameLastId。我的参数表存储了最后一个id。当我添加新用户时,我的方法addUser执行此操作:

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

它在工作。但它是一个Web应用程序,那么1000个人同时如何呢?也许他们中的一些得到了相同的最后一个id。我怎么解决这个问题?我已尝试使用synchronized,但它无效。

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

我知道用户必须等待。

1 个答案:

答案 0 :(得分:0)

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

我更喜欢'Next ID',因为它使逻辑更清晰,所以我将在这个例子中使用它。

  1. 从分配器表中选择NextID。
  2. 更新NextID SET NextID = NextID +增量WHERE NextID =您读取的值
  3. 循环,而RowsAffected!= 1。
  4. 当然,在选择/更新时也可以使用TableName条件来选择适当的分配器行。

    你还应该看看在块中分配 - 增量= 200,比如说 - 并在appserver中缓存它们。这将提供更好的并发性和比每次点击DB要快很多。