Я пытаюсь создать простое приложение, которое будет сохранять объект каждый раз, когда выполняется запрос на получение. В приведенном ниже коде для этого я использую сервлет 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();

    }
}

Моя проблема в том, как получить количество объектов, хранящихся в хранилище данных?

0
NEO 20 Фев 2014 в 21:55

1 ответ

Лучший ответ

Вы должны быть очень осторожны с использованием счетчиков в хранилище данных. Все операции с хранилищем данных рассчитаны на масштабирование в соответствии с размером набора результатов, а не размером сохраненного набора данных. Это означает, что нет эффективного способа подсчитать все объекты в вашем хранилище данных. В больших распределенных системах трудно поддерживать строго согласованный подсчет, вы можете увидеть, что необходимо для реализации этого для сегментированные счетчики.

Кроме того, не следует хранить данные с использованием последовательных ключей. Кроме того, вы можете столкнуться с проблемами производительности, если сохраните данные в последовательном порядке. Вот почему политика выделения идентификаторов по умолчанию в Datastore перешла на использование разбросанные (непоследовательные) идентификаторы.

Чтобы перебрать все ваши объекты, вы должны выполнить запрос по виду вашего продукта.

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 его. Вы захотите убедиться, что если это необходимо, вы переосмыслите свой дизайн данных в структуре. это для сильной согласованности.

2
Patrick Costello 20 Фев 2014 в 23:16
Патрик, при твоей репутации 999 я не могу удержаться от того, чтобы подтолкнуть тебя более чем на 1 тысячу!
 – 
Martin Berends
20 Фев 2014 в 23:42
Что ж, спасибо тебе! Я беспокоил своих коллег, как я был так рад быть так близок.
 – 
Patrick Costello
20 Фев 2014 в 23:44