您好昨天问了一个问题,现在简化了问题,看看它是否更容易解决/诊断。过度的数据存储创建时写入
我想批量创建500个JDO实体,每个实体都有一个“Key”作为主键,两个索引字符串和一个未索引字符串。
当我创建500个实体它使用数据存储区写入quoto(从500000 quoto)的6%,这是这相当于每60个实体写入30000个写入操作。在开发服务器上,“写操作”是6,它与关于数据存储写入的各种评论一致。没有搜索,也没有复合索引,我只是创建了500个实体。
那么,为什么我的实体需要60? JDO的实体是如下:
import javax.jdo.annotations.Extension;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import com.google.appengine.api.datastore.Key;
@PersistenceCapable
public class Product {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private String productId;
@Persistent
private String productName;
@Persistent
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
private String merchantProductId;
.
.// getters and setters here but not included in post
.
}
500个实体在循环中创建:
private void createBulkProducts(PrintWriter out){
int cnt = 0;
Product tmpProd = null;
PersistenceManager pm = PMF.get().getPersistenceManager();
ArrayList<Product> products = new ArrayList<Product>();
for(cnt = 0; cnt < 500; cnt++){
tmpProd = createBulkProduct(new Integer(cnt).toString());
products.add(tmpProd);
}
if(products.isEmpty() == false){
pm.makePersistentAll(products);
out.println(products.size() + " bulk products committed to database");
}
pm.close();
out.println(cnt + " bulk products inserted");
}
private Product createBulkProduct(String cnt){
Product product = new Product();
product.setMerchantProductId("mid" + cnt);
product.setProductId("pid" + cnt);
product.setProductName("the quick brown fox jumps over the lazy dog " + cnt);
return product;
}
我在GAE上运行1.6.1
所有帮助/建议不胜感激 克雷格
您是否启用了会话? – 2012-03-30 14:40:21
重复:这真的是同一个问题:http://stackoverflow.com/questions/9927248/datastore-writes-when-creating-deleting-jdo-entries – dragonx 2012-03-30 14:44:21
为复制的,但我简化,使其更容易跟踪问题答案很简单,配额是50,000,而不是500,000,所以我认为如果事实一切正常,都会出现问题。 – 2012-03-30 16:07:07