统计数据存储AppEngine java中的对象数
我正在尝试做一个简单的应用程序,它将在每次发出get请求时持久化一个对象。在下面的代码中,我使用一个servlet Put来实现这一点统计数据存储AppEngine java中的对象数,java,google-app-engine,servlets,Java,Google App Engine,Servlets,我正在尝试做一个简单的应用程序,它将在每次发出get请求时持久化一个对象。在下面的代码中,我使用一个servlet Put来实现这一点 public class Put extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("t
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();
}
}
我的问题是如何获取存储在数据存储中的对象数?在使用数据存储中的计数时应该非常小心。所有数据存储操作都设计为根据结果集的大小而不是存储的数据集的大小进行扩展。这意味着没有有效的方法来统计数据存储中的所有实体。在大型分布式系统中,很难保持强一致性计数,您可以看到实现这一点的必要性 此外,不应使用顺序键存储数据。此外,按顺序存储数据可能会遇到性能问题。这就是为什么会这样 为了在所有实体上循环,您应该在您的产品种类上发布一个
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();
}
还要注意,您的查询最终会保持一致。这意味着您可能在
put
查询后的一段时间内看不到查询结果。您需要确保,如果有必要,您可以重新考虑您的数据设计。Patrick,以您999的声誉,我忍不住要把您推到1k以上!好的,谢谢你!我一直在困扰我的同事们,因为我和他们如此亲密是多么的兴奋。
Query q = pm.newQuery(Product.class);
q.setOrdering("timestamp");