Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine Java数据存储写入性能:Objectify与JPA_Google App Engine_Jpa_Google Cloud Datastore_Objectify - Fatal编程技术网

Google app engine Java数据存储写入性能:Objectify与JPA

Google app engine Java数据存储写入性能:Objectify与JPA,google-app-engine,jpa,google-cloud-datastore,objectify,Google App Engine,Jpa,Google Cloud Datastore,Objectify,我针对数据存储运行了两个5分钟长的简单基准测试。一个在Google提供的Datanucleus之上使用JPA实现,另一个使用Objectify实现持久性。每个请求都创建了10个具有相同9个字段的新索引实体,每个字段使用另一个数据类型。为了避免网络连接造成任何影响,基准测试返回了10次写入开始和结束之间的时间跨度 AVG Median 10% 90% 99% JPA 76.5 76 53 98 114 Objectify 41.1

我针对数据存储运行了两个5分钟长的简单基准测试。一个在Google提供的Datanucleus之上使用JPA实现,另一个使用Objectify实现持久性。每个请求都创建了10个具有相同9个字段的新索引实体,每个字段使用另一个数据类型。为了避免网络连接造成任何影响,基准测试返回了10次写入开始和结束之间的时间跨度

AVG Median 10% 90% 99% JPA 76.5 76 53 98 114 Objectify 41.1 40 39 43 57 Objectify TX 50.6 50 44 60 69
你不应该再担心这个了。现实世界中的应用程序不太可能由POJO到数据存储的映射控制。选择您想花时间编程的API


测试的一个怪癖是,因为Objectify代码使用异步保存,所以您看到了很多在JPA测试中没有看到的并发性。FWIW,无法从JPA访问异步API。

您可能需要尝试低级数据存储API进行比较。它们不提供相同的功能。谷歌的JPA插件提供了完整的JPA功能,拦截AFAIK不在Objectify中的更新等,这并不是对Objectify的批评,只是JPA拥有它们,如果它们对你有用的话——所有这些都取决于你想做什么,哪一个是最合适的。如果您决定在不跟踪更改的情况下将对象推送到DB或从DB推送对象,请选择Objectify。除此之外,谷歌的JPA插件使用了DataNucleus项目很久以前就停止使用的古老代码AFAIK。即使我不知道谷歌JPA for App Engine的具体实现细节,看起来他们不久前就放弃了该插件。在阅读了答案之后,我现在认为这真的取决于你的应用程序必须做什么。如果它是从JEE迁移过来的,或者您必须遵守Java标准,那么JPA是一个不错的选择。Objectify将您锁定到App Engine数据存储中,但也显示了最佳的数据存储感知实现。从性能的角度来看它们很好,但不应该影响JPA和Objectify之间的决定。我认为,如果应用程序必须尽快响应,那么选择一个快速持久性提供程序是至关重要的,首先,要做到“苹果对苹果”,就要去掉JPA代码中的显式事务——Objectify文档中的注释也适用于JPA。第二,Objectify和JPA之间的任何真正区别都将是少量的计算工作,不太可能成为GAE总账单中的主要因素……说清楚点,我更喜欢Objectify——我写的。但这是因为它有一个更好的编程模型,而不是出于性能的原因。我同意,大部分成本节约都可以在数据存储中找到,并减少不必要的写入。但为了记录在案:我将Objectify write包装在一个事务中,以查看结果是否会发生显著变化——它们不会。JPA版本和Objectify之间仍然存在差距。因此,JPA的唯一有效理由是使用JEE标准技术,而不是专有的API来实现持久性。但即便如此,数据存储JPA实现仍然有许多缺少的JPA/RDBMS特性,因为它是无模式的NoSQL特性(这可能也是性能缺陷背后的原因)。在与GAE/J插件以及它的JPA实现和Objectify进行了大量工作之后,Objectify成为我的首选。使用JPA很容易出错,有时发现错误会导致插件的代码出错。另一方面,客观化从一开始就是一条更容易的道路。它甚至可以很好地集成到基于RingoJS的应用程序中,这对我来说是一个很大的好处。只是想在将近一年后强调这一点;)
// Objectify
public TimedBenchResult writeIndexedAsyncBenchmark() {
  TimedBenchResult result = new TimedBenchResult();    

  for (int i = 0; i < 10; i++) {
      ofy().save().entity(MyUtils.randomIndexedEntity()).now();
  }    

  result.stop();
  return result;
}
// JPA
public TimedBenchResult writeIndexedBenchmark() {
   EntityManager em = EntityManagerSingleton.getEntityManager();    

   TimedBenchResult result = new TimedBenchResult();    

   try {
      for (int i = 0; i < 10; i++) {
          // Transaction needed
          // otherwise too much entity groups are involved
          em.getTransaction().begin();
          em.persist(MyUtils.randomJPAIndexedEntity());
          em.getTransaction().commit();
      }
   } finally {
      em.close();
      result.stop();
   }    

   return result;
}