java - Google App Engine (Java) - JDO PersistenceManager makePersistentAll 速度减慢

标签 java google-app-engine google-cloud-datastore jdo

我有一个迷你 CRM 应用程序。我正在尝试添加功能以允许批量用户导入。上传处理程序从 CSV 文件中读取数据,然后调用我的 CustomerService 类将 Customer 对象存储在数据存储区中:

public int createCustomers(final List<Customer> customers) {
    List<List<Customer>> buckets = bucketList(customers);
    int bucketCount = 0;
    PersistenceManager persistenceManager = PMF.get().getPersistenceManager();
    for(List<Customer> bucket: buckets) {
        Collection<Customer> makePersistentAll = persistenceManager.makePersistentAll(bucket);
    }           
    return customers.size();        
}

bucketList 方法只是将大列表分解为较小的列表。我这样做是为了尝试调整应用程序并查看 makePersistentAll 调用是否有最佳大小。我目前将其设置为 1000,并使用包含 100,000 条记录的 CSV 文件进行测试。随着添加更多记录(特别是在 60K 记录标记附近),应用程序似乎变得越来越慢。我尝试将 Customer 中的所有字段设置为未索引,但这似乎没有任何明显的区别:

@PersistenceCapable
public class Customer implements Serializable {

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;

@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
@Persistent
private String accountNumber;
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
@Persistent
private String email;
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
@Persistent
private String firstName;
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
@Persistent
private String lastName;
    ...

我已经在开发(本地)以及生产 App Engine 中对此进行了测试,但没有成功。我认为这是一个比较常见的用例,将大量数据导入系统并将其快速保存到数据存储中。我尝试了很多方法来让它发挥作用: - 使用异步数据存储服务 - 逐一保存客户对象(makePersistent) - 使用Customer中的Key对象作为主键 - 使用 accountNumber 字符串作为主键

但似乎没有什么能带来太大的不同。

最佳答案

建议您查看http://www.datanucleus.org/products/accessplatform_3_2/jdo/performance_tuning.html特别是涉及大量对象的“持久化过程”。您可以减少注入(inject)到“makePersistentAll()”中的对象数量,这样您就可以进行多次调用。显然,GAE/数据存储可能存在一些奇怪的情况,可能导致此情况

关于java - Google App Engine (Java) - JDO PersistenceManager makePersistentAll 速度减慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15262744/

相关文章:

google-bigquery - 以编程方式导出 Google Cloud Datastore 并导入到 BigQuery

javascript - 公共(public) API 访问不适用于数据存储 javascript API 的 gapi.client

JavaScript 和 Json : Excluding Fields From Serialization and Deserialization

Java - 获取id从链接中删除所有字符

java - Apache Tomcat 7 显示空白页面 Mac OSX 10.8

java - 在 Java 中重复排列数组

php - 带有文件输入的表单不适用于 GAE

java - 如何使用 appspot.com 在谷歌应用引擎上配置 SSL

google-app-engine - 加载作业失败,错误字段 {field-name} 已存在于架构中

java - 错误 :The import com. google.appengine.api.datastore 无法解析 JPA GAE GWT