JPA: шаблон для обработки исключения OptimisticLockException

каков правильный шаблон для обработки OLE в веб-службе (REST)? это то, что я делаю сейчас, например,

protected void doDelete(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    ...
    ...
    ...

    try {
        try {
            em.getTransaction().begin();
            // ... remove the entity
            em.getTransaction().commit();
        } catch (RollbackException e) {
            if (e.getCause() instanceof OptimisticLockException) {
                try {
                    CLog.e("optimistic lock exception, waiting to retry ...");
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                }
                doDelete(request, response);
                return;
            }
        }

        // ... write response

    } catch (NoResultException e) {
        response.sendError(HttpServletResponse.SC_NOT_FOUND, e.getMessage());
        return;
    } finally {
        em.close();
    }
}

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

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

спасибо.

17
задан Jeffrey Blattman 30 June 2011 в 22:03
поделиться