Я пытаюсь создать простое приложение, которое будет сохранять объект каждый раз, когда выполняется запрос на получение. В приведенном ниже коде для этого я использую сервлет 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,
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();
}
}
Моя проблема в том, как получить количество объектов, хранящихся в хранилище данных?
1 ответ
Вы должны быть очень осторожны с использованием счетчиков в хранилище данных. Все операции с хранилищем данных рассчитаны на масштабирование в соответствии с размером набора результатов, а не размером сохраненного набора данных. Это означает, что нет эффективного способа подсчитать все объекты в вашем хранилище данных. В больших распределенных системах трудно поддерживать строго согласованный подсчет, вы можете увидеть, что необходимо для реализации этого для сегментированные счетчики.
Кроме того, не следует хранить данные с использованием последовательных ключей. Кроме того, вы можете столкнуться с проблемами производительности, если сохраните данные в последовательном порядке. Вот почему политика выделения идентификаторов по умолчанию в Datastore перешла на использование разбросанные (непоследовательные) идентификаторы.
Чтобы перебрать все ваши объекты, вы должны выполнить запрос a> по виду вашего продукта.
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();
}
Обратите внимание, что по мере того, как вы получаете больше сущностей, в конечном итоге у вас будет слишком много сущностей для отображения на одной странице. Вы должны спланировать это, установив ограничения и используя курсоры. для реализации пейджинга.
Если вы хотите, чтобы результаты были в порядке даты, вам нужно будет упорядочить их по метке времени:
Query q = pm.newQuery(Product.class);
q.setOrdering("timestamp");
Также будьте осторожны, чтобы ваш запрос в конечном итоге был согласованным. Это означает, что вы можете не видеть результаты своего запроса в течение некоторого времени после того, как put
его. Вы захотите убедиться, что если это необходимо, вы переосмыслите свой дизайн данных в структуре. это для сильной согласованности.
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].