Google app engine Can';t将生成的密钥增加1

Google app engine Can';t将生成的密钥增加1,google-app-engine,datanucleus,Google App Engine,Datanucleus,我正在使用Java和JPA进行ORM 最初我是这样定义实体键的: @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Key key; 但这导致了ID以不可预测的方式快速增长(…19,20,221003…1007101410152004…) 这似乎与“最简单的键字段是一个长整型值,当对象第一次保存到数据存储时,JPA会自动填充该值,该值在类的所有其他实例中都是唯一的。长整型键使用@Id注释和@GeneratedValu

我正在使用Java和JPA进行ORM

最初我是这样定义实体键的:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;
但这导致了ID以不可预测的方式快速增长(…19,20,221003…1007101410152004…)

这似乎与“最简单的键字段是一个长整型值,当对象第一次保存到数据存储时,JPA会自动填充该值,该值在类的所有其他实例中都是唯一的。长整型键使用@Id注释和@GeneratedValue(策略=GenerationType.IDENTITY)注释“

因此,我找到了单元测试,并切换到它在那里完成的方式:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
在更新了一些GQL语句之后,它迁移得很好,但我仍然看到键每次增加1000个

我应该使用GenerationType.TABLE吗?还是应该在长字段而不是键字段上使用IDENTITY

我希望在我的live(beta)应用程序中不断更改之前能得到一些明确的答案。不幸的是,我在dev env中使用的所有方案都会产生连续的密钥,因此除了部署之外,实在没有办法测试新的方法


提前感谢。

在App Engine上执行连续键确实很困难。文档从未声明自动生成的键是连续的,只是它们将是唯一的


app engine上最简单的解决方案是设计您的密钥,这样您就不需要它们是连续的。考虑到BigTable的设计方式,如果您确实有连续递增的密钥,那么每当平板电脑需要在引擎盖下拆分时,您可能会遇到一些性能瓶颈。

在app engine上执行连续密钥非常困难文档从未声明自动生成的密钥是连续的,只是声明它们是唯一的


app engine上最简单的解决方案是设计密钥,这样您就不需要它们是连续的。考虑到BigTable的设计方式,如果您确实有连续递增的密钥,那么每当平板电脑需要在引擎盖下拆分时,您可能会遇到一些性能瓶颈。

我想我应该更具体一些,我不一定要查看g对于连续的保证,只是一次不能增加10秒、100秒甚至1000秒。不管怎样,最简单的方法是在设计中考虑到这一点。否则,您需要分配自己的密钥。在这个过程中,您需要确保使用的每个密钥都是唯一的(否则您将覆盖自己的数据)。因为不同的请求会命中不同的服务器实例,所以您需要某种方式进行同步,以确保不会同时在两个服务器实例上生成相同的密钥。大多数情况下,您真正需要的只是一个唯一的密钥。我猜,作为优化,每个实例提前保留1000个键值。但实例可能会e由于许多原因而短暂。您可能看到实例重新启动的迹象。这正按照设计和预期工作。@DaveW.Smith这很有意义,但似乎不是这样。我只是快速连续添加了6个实体,同时看着我的实例从1个增加到4个,并且ID都增加了1000。所以告诉我可能是的,它保留了1000个,但不是,它不是获得新实例的情况(因为我没有看到5个或更多的新实例为这些添加请求提供服务).所以我倾向于认为这是Datanucleus的问题,或者我如何配置它,使其保留1000个,使用1个,然后丢弃其余的。不相关,但如果您正在执行6个操作并获得4个实例,启用多线程可能是一个好主意。我想我应该更具体一些,我不一定要寻找一个连续的Gurantee,只是它不能一次递增10秒、100秒甚至1000秒。不管怎样,最简单的方法是在设计中考虑到这一点。否则,您需要分配自己的密钥。在这个过程中,您需要确保您使用的每个密钥都是唯一的(否则您将覆盖自己的数据)。因为不同的请求会命中不同的服务器实例,所以您需要某种方式进行同步,以确保不会同时在两个服务器实例上生成相同的密钥。大多数情况下,您真正需要的只是一个唯一的密钥。我猜,作为优化,每个实例提前保留1000个键值。但实例可能会e由于许多原因而短暂。您可能看到实例重新启动的迹象。这正按照设计和预期工作。@DaveW.Smith这很有意义,但似乎不是这样。我只是快速连续添加了6个实体,同时看着我的实例从1个增加到4个,并且ID都增加了1000。所以告诉我可能是的,它保留了1000个,但不是,它不是获得新实例的情况(因为我没有看到5个或更多的新实例为这些添加请求提供服务).所以我倾向于认为这是Datanucleus的问题,或者我如何配置它,使其保留1000个,使用1个,然后丢弃其余的。不相关,但如果您执行6个操作并获得4个实例,启用多线程可能是一个好主意。Generation.TABLE不适用于GAE JPA,因为它与数据不匹配存储体系结构.IDENTITY更有意义Generation.TABLE未为GAE JPA实现,因为它不适合数据存储体系结构。IDENTITY更有意义