我有一个迷你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记录标记附近,该应用程序的速度似乎越来越慢。我尝试将“客户”中的所有字段都设置为未索引,但这似乎没有什么明显的不同:

@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中对此进行了测试,但无济于事。我认为这是一个比较常见的用例,将大量数据导入系统并快速将其保存到数据存储中。我已经尝试了很多方法来使其工作:
-使用AsyncDatastoreService
-一对一保存客户对象(makePersistent)
-使用客户中的Key对象作为主键
-使用accountNumber字符串作为主键

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

最佳答案

建议您查看http://www.datanucleus.org/products/accessplatform_3_2/jdo/performance_tuning.html,特别是有关大量对象的“持久性过程”。您可以减少被抽入"makePersistentAll()"的对象的数量,因此您会有多个调用。显然,GAE /数据存储区可能有些奇怪,可能导致

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

10-10 10:46