【问题标题】:Java Database AutoIncrement Primary Key AlgorithmJava 数据库自增主键算法
【发布时间】:2012-05-02 08:37:23
【问题描述】:

我有一个带有自动增量主键的 sqlite 数据库,它通过 java 接口。 由于应用程序的原因,我不能使用数据库中自动生成的主键,所以我需要为 java 中的每一行创建一个 id。

所以我的问题是,是否有一种适用于 java 的算法,我可以遵循它来为数据库创建唯一的整数 id。

我知道我可以增加等,但我需要使用回滚、溢出和间隙填充等东西。

【问题讨论】:

  • 出于“申请原因”?我不确定你到底是什么意思,但也许 sqlite 的 sqlite3_int64 sqlite3_last_insert_rowid 可以帮助你并使使用数据库生成你的 ID 成为可能......看看文档:sqlite.org/c3ref/last_insert_rowid.html
  • 由于我们应用程序的设计,我们需要能够在记录写入数据库之前知道记录的 id,如果我们允许 sqlite 管理 id 创建,sqlite3_last_insert_rowid 会有所帮助,基本上我想要数据库中使用的自动增量算法的java实现
  • 你真的需要填补空白吗?如果不是,那么最简单的方法是实现类似于 Oracle 的序列的东西,即一种以原子方式获取顺序 id 的方法。您的应用程序负载平衡(或者永远不会)?如果是这样,那么我不会在代码中这样做。
  • 应用程序没有负载均衡,填空可能不是问题,但在 sqlite 中整数 ID 是否有最大值?
  • 它很大 - 请参阅 SQLite3 Integer Max ValueLimits In SQLite

标签: java sql


【解决方案1】:

根据您的应用要求,您可以将主键 Integer 更改为 String 并使用 java util class java.util.UUID。它表示一个不可变的通用唯一标识符 (UUID)。一个 UUID 代表一个 128 位的值。

如果应用程序具有整数主键的任何持久性。您可以编写一个产生序列号的函数。它背后的逻辑是,基本上它需要有当前的序列。如果没有,则调用 db 并获取最大条目。

static Integer currentSequence=-1;
static Integer function primaryKeyGenerator(){
 if(currentSequence==-1){
   //Make a db call and get the max
  if(no data in table){
    currentSequence=1;
  }else
   currentSequence=rs.getInt(1);
 }
return currentSequence+=1;
}

【讨论】:

  • 如果你的应用是多线程的,这个函数需要同步
  • 你绝对是 r8。但它只是一个sn-p。构思如何实施。
  • 当然 - 我猜 'function' 关键字应该提醒我这是伪代码 ;-)
猜你喜欢
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多