我正在尝试创建一个简单的应用程序,每次发出get请求时都会持久保存对象。在下面的代码中,我使用servlet Put来完成此任务。
public class Put extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");
PersistenceManagerFactory PMF = JDOHelper
.getPersistenceManagerFactory("transactions-optional");
PersistenceManager pm = PMF.getPersistenceManager();
String id = req.getParameter("id");
String name = req.getParameter("name");
String email = req.getParameter("email");
String productId = req.getParameter("productid");
String timeStamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
String mailSent = req.getParameter("mailsent");
Product product = new Product(id,name,email,productId,timeStamp,mailSent);
/*
* Get number of objects persisted till now
* Increment the count and use that value as key
*/
Key key = KeyFactory.createKey(Product.class.getSimpleName(),
"1001"); // ??
product.setKey(key);
try {
pm.makePersistent(product);
} finally {
pm.close();
}
}
}
检索我使用Get servlet的所有对象,
public class Get extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");
PersistenceManagerFactory PMF = JDOHelper
.getPersistenceManagerFactory("transactions-optional");
PersistenceManager pm = PMF.getPersistenceManager();
/*
* Get number of objects stored
* loop from 0 to the count and print all objects
*
*/
Product e = pm.getObjectById(Product.class, req.getParameter("id"));
resp.getWriter().println();
}
}
我的问题是如何获取存储在数据存储区中的对象数量?
答案 0 :(得分:2)
在数据存储区中使用计数时应该非常小心。所有数据存储区操作都旨在根据结果集的大小进行扩展,而不是根据存储的数据集的大小进行扩展。这意味着没有有效的方法来计算数据存储区中的所有实体。在大型分布式系统中,很难保持强一致性计数,您可以看到为sharded counters实现此操作所需的内容。
此外,您不应使用顺序密钥存储数据。此外,您可以通过按顺序存储数据来解决性能问题。这就是default id allocation policy in Datastore switched to using scattered (non-sequential) ids。
的原因为了遍历您的所有实体,您应该对您的产品类型发出query。
Query q = pm.newQuery(Product.class);
try {
List<Product> results = (List<Product>) q.execute();
if (!results.isEmpty()) {
for (Product p : results) {
// Process result p
}
} else {
// Handle "no results" case
}
} finally {
q.closeAll();
}
请注意,当您获得更多实体时,您最终会在单个页面上显示太多实体。您应该通过设置限制并使用cursors来实现分页来为此做好计划。
如果您希望结果按日期排序,则必须按时间戳排序:
Query q = pm.newQuery(Product.class);
q.setOrdering("timestamp");
另外请注意,您的查询最终会保持一致。这意味着在您put
之后的某段时间内,您可能无法在查询中看到结果。您需要确保在必要时将数据设计重新考虑为structure it for strong consistency。