Java 不使用数据库生成主键

Java 不使用数据库生成主键,java,database,oracle,primary-key,Java,Database,Oracle,Primary Key,我最近遇到了一个问题,是关于“在由5台应用服务器组成的集群环境中生成主键-[OAS版本10],而不使用数据库” 通常我们通过DB序列生成PK,或者将值存储在数据库表中,然后使用SP生成新的PK值……但是当前的要求是为我的应用程序生成主键,而不使用JDK 1.4引用数据库 需要专家的帮助才能找到更好的处理方法 谢谢,如果您根本无法使用数据库,GUID/UUID是唯一可靠的方法。不过,如果您可以偶尔使用数据库,请尝试。如果它适合您的应用程序,您可以使用一个更大的字符串键加上UUID()函数或SHA1

我最近遇到了一个问题,是关于“在由5台应用服务器组成的集群环境中生成主键-[OAS版本10],而不使用数据库”

通常我们通过DB序列生成PK,或者将值存储在数据库表中,然后使用SP生成新的PK值……但是当前的要求是为我的应用程序生成主键,而不使用JDK 1.4引用数据库

需要专家的帮助才能找到更好的处理方法


谢谢,

如果您根本无法使用数据库,GUID/UUID是唯一可靠的方法。不过,如果您可以偶尔使用数据库,请尝试。

如果它适合您的应用程序,您可以使用一个更大的字符串键加上UUID()函数或SHA1(随机数据)

对于sequential int,我将把它留给另一个海报。

使用a作为主键和it客户端

编辑:
由于你的评论,我觉得我应该进一步说明为什么这是一种好的做事方式

尽管顺序主键在数据库中最为常见,但对于分布式数据库或(尤其是)支持“断开连接”用户界面的数据库(即用户并非始终连续连接到数据库的UI),使用随机生成的主键通常是最佳选择

UUID是随机生成密钥的最佳形式,因为它们保证是非常唯一的;同一UUID生成两次的可能性非常低,几乎完全不可能。uuid也无处不在;几乎每个平台都支持内置的一代,而对于那些没有内置的平台,几乎总是有第三方库来填补空白

使用随机生成的主键的最大好处是,您可以在客户端构建许多复杂的数据关系(主键和外键)(例如,当您准备保存时)只需在一次大容量插入中将所有内容转储到数据库,而无需依赖插入后的步骤来获取后续关系插入的密钥

相反,UUID是16字节,而不是标准的4字节
int
——是空间的4倍。这真的是当今的问题吗?我想说不是,但我知道有些人会反对。涉及UUID时,唯一真正的性能问题是索引,特别是集群索引。我将走进SQL Server的世界,因为我并不经常使用Oracle进行开发,这是我目前的舒适区,我将讨论SQL Server默认情况下会在表主键上的所有字段上创建聚集索引这一事实。这在自动递增int世界中工作得相当好,并为基于键的查找提供了一些良好的性能。然而,任何一位称职的DBA都会以不同的方式进行集群,但是那些不注意集群的人,以及那些同时使用UUID(微软世界中的GUID)的人,在插入量大的数据库上往往会遇到一些严重的减速,因为每次插入都必须重新计算聚集索引,如果它是针对UUID进行聚集的,可以将新的密钥放在聚类序列的中间,可能需要重新安排大量数据来保持聚集索引。在Oracle世界中,这可能是一个问题,也可能不是一个问题——我只是不知道Oracle PK是否在默认情况下像在SQL Server中一样进行集群


如果那个run-on语句太难理解,请记住:如果您使用UUID作为主键,请不要在该键上聚集

>你应该考虑使用UUID形式的IDS。Java5有一个表示它们的方法(并且必须有一个工厂来生成它们)。有了这个工厂类,您可以将代码向后移植到您的目标Java 1.4中,以获得所需的标识符。

您可能会发现查找UUID生成很有帮助

在简单的情况下,一个程序在每台机器上运行一个线程,您可以执行以下操作

MAC address + time in nanseconds since 1970.
看看Hibernate使用的(链接中的第5.1.5节)。你一定会发现它很有用。 它解释了几种方法及其优缺点,还说明了它们在集群环境中是否安全


最重要的是,有一些可用的代码已经为您实现了它:)

您可以基于以下三件事情的组合生成密钥

  • 机器的IP地址或MAC地址
  • 当前时间
  • 每个实例上的增量计数器(确保同一个密钥不会在一台机器上生成两次,因为由于潜在的时间精度,两个即时密钥创建中的时间可能相同)

  • 通过使用Statement对象,可以调用Statement.getGeneratedKeys();方法检索由执行此语句对象生成的自动生成的键


    以下是在MongoDB中的实现方式:

    它们包括一个时间戳

    但您也可以安装Oracle Express并选择序列,您可以批量选择:

    SQL>按级别<20从双连接中选择mysequence.nextval

    下特瓦尔 为什么不允许您使用数据库?金钱(Oracle express是免费的)还是单点故障?或者,您希望将来支持Oracle以外的其他数据库吗

    它在许多基于Spring的应用程序(如Hybris)中提供了OOB-
    typeCode
    是表的名称,如,
    User
    Address

    private PK generatePkForCode(final String typeCode)
        {
            final TypeInfoMap persistenceInfo = Registry.getCurrentTenant().getPersistenceManager().getPersistenceInfo(typeCode);
            return PK.createCounterPK(persistenceInfo.getItemTypeCode());
        }
    

    你需要一个数字主键还是一个基于字符串的也可以?只是好奇。。。请简要解释一下,为什么不能使用数据库生成主键?数据类型没有限制。字符串也可以工作。这似乎适用于JDK1.5,我的要求是适用于JDK1。4@apx1sharma:啊,我完全没有注意到你问题中的限制。这里有两个第三方库可以做到这一点:正如我在上面提到的“Radolpho”。。UUID类可用于JDK 5,但我
    private PK generatePkForCode(final String typeCode)
        {
            final TypeInfoMap persistenceInfo = Registry.getCurrentTenant().getPersistenceManager().getPersistenceInfo(typeCode);
            return PK.createCounterPK(persistenceInfo.getItemTypeCode());
        }