【问题标题】:int in java runs out of 2 billion, any alternative?java中的int用完了20亿,还有其他选择吗?
【发布时间】:2013-03-14 16:07:01
【问题描述】:

我在Java应用程序中使用int作为PK,现在它已经达到了最大int值(20亿),即使在DB中它也可以存储比它更多的数字。但是java int只能装20亿左右。

我无法将 int 更改为 long 以与 DB 对齐。因为这是巨大的努力。

除了这个,还有人有办法吗?

【问题讨论】:

  • 你已经回答了你的问题。
  • 上周,同样的问题被问到了。让我看看能不能找到。
  • 您是否使用了从 1 到 Integer.MAX 的所有整数?您可以重置您的自动增量以重复使用您之前使用过的数字吗?
  • 您有多种选择。 1.在java中改为使用long。这是您拥有的最佳选择。 2.java中改为使用Sting作为pk值。 3. 找一份新工作,让别人改用java中的long。
  • 为什么不用20亿到40亿之间的20亿值,int可以表示呢? (请注意,值 >= 2^31 在 java 中将被解释为负值,但这并不重要,只要您将它们仅用作键。)

标签: java integer max


【解决方案1】:

Java 中整数的最大值为 2,147,483,647。如果您需要更大的数字,则必须更改为 long。您也可以使用整数的负值范围,但如果您已经达到最大值,您可能很快就会用完空间。

但是,如果数据库中没有 20 亿个元素,则可以重用未使用的主键。这可能效率低下,因为您必须搜索未使用的密钥。

我建议您尝试更改代码。从长远来看,现在付出努力会得到回报。

【讨论】:

    【解决方案2】:

    我无法将 int 更改为 long 以与 DB 对齐。因为这是巨大的努力。

    从长远来看,您别无选择。开始编码。

    实际上,如果您有条不紊地进行,您可能会发现这根本不是一项巨大的努力。 Java IDE 非常适合帮助您进行此类更改。


    @jjnguy 建议您让键环绕为负数。这会给你 20 亿个左右的额外密钥,但是:

    • 您可能会比前 20 亿更快地使用第二个 20 亿,并且
    • 您的应用程序(或数据库)可能依赖于始终增加的键。

    所以我会避免这种情况,除非即将发生翻车。

    【讨论】:

    • 实际上,与其他软件组件的交互可能使这变得困难。
    • 是的,好吧......这些 id 走得越远,情况就越糟糕。但是您会希望外部组件不依赖于数据库 pks 的表示。好消息是,除了传递 pk 值并比较它们之外,不太可能尝试做任何事情。算术等不太可能......
    • 我的应用程序无法处理负数。那么可以将负数部分切换为大于20亿的数字吗?因为 int 可以容纳 40 亿个数字。
    • 不,你不能。 Java int 类型已签名,有 2,000,000,000 个正值和 2,000,000,000 个负值(大约)。你不能神奇地改变使 Java int 无符号。
    • @user2166163 这不是数字,它只是位模式,因此既不是负数也不是正数,尽管人们告诉你有符号与无符号的区别。事实上,您可以使用 int 来制作 2^32 个不同的键。但是,可以肯定的是,如果您将其解释为 number,并且您的程序无法处理负数,那么您做错了。至少您可以在程序中将键用作数字的部分中使用 long?
    【解决方案3】:

    我假设您没有对 ID 使用负值。如果是这种情况,您可以让值溢出为负值。这将给您一些时间来重构您的代码以使用 long 来存储您的数据。

    【讨论】:

    • 没错,一个 int 可以有超过 40 亿个不同的值。
    【解决方案4】:

    你只需要用uint、long等替换int,没有别的办法

    【讨论】:

      【解决方案5】:

      这里大家建议改成long。在我看来,这也是最直接的方法。但是,您要求的是不同的。

      您还可以创建另一个具有长值的列,从 PK 中复制该值,然后将其设置为 PK。尽管从技术上讲,我认为这需要更多工作,但对于您的情况,这可能会更好,而且严格来说,这是对您对另一种方法的问题的回答。

      (也许你有某种分片情况,有数千个分片,你不可能同时交换所有分片)。无论哪种方式都要非常小心!运行测试!

      【讨论】:

        【解决方案6】:

        在 Java 中使用 BigInteger 类。你可以变大,我的意思是非常大的值。请参考此链接:How to use BigInteger?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-02-09
          • 1970-01-01
          • 2011-04-21
          • 1970-01-01
          • 2020-11-03
          • 1970-01-01
          • 1970-01-01
          • 2015-08-22
          相关资源
          最近更新 更多