2015-12-20 4 views
2

Я пытаюсь найти решение для обеспечения надежности в нашем webapp. Планируется сбрасывать sql вместе с данными, если соединение с сетью/соединение с базой данных теряется. В текущей реализации мы имеем Rest controller, Service, DAO. DAO выбрасывает PersistenceExcetpion, и это распространяется до уровня контроллера.Надежность здания весной JPA webapp

Пример кода:

public MyDAOClass { 
    public void save(Object object) { 
     try { 
      entityManager.persist(object); 
     } catch (PersistenceException e) { 
      throw new DBException("Error occurred in save", e); 
     } 
    } 
} 

является исключение во время выполнения.

Теперь возникает актуальный вопрос. Один из товарищей по команде предложил иметь пользовательские исключения, например, например. InsertException, UpdateException и т. Д. И если мы сталкиваемся с каким-либо из этих исключений, мы знаем, какая операция была выполнена на этом объекте, чтобы он мог быть сохранен в файле в соответствии с SQL.

Например. Допустим, что код не смог сохранить объект Employee. Это вызовет InsertException и создаст запись в файле в качестве вставки sql-инструкции для этого объекта. insert into employeee values ('firstname','lastname');

Для меня идея реализации создания sql-файла при потерях связи не кажется таким простым, как реализация вышеизложенного.

Заданные мной вопросы: 1) Как вы обрабатываете, когда в методе обслуживания выполняются несколько действий (например, любая комбинация вставки, обновления, удаления)? 2) Как насчет разных исключений? Я имею в виду, что причина для PerisistenceException может быть чем-то вроде сдерживания ограничений, сущность не найдена и т. Д., А не только проблема подключения.

Есть ли способ реализовать описанный выше сценарий, который также учитывает все различные условия.

Спасибо.

Обновление: Основано на комментариях chrylis. Я должен был добавить это к вопросу. Это webapp, работающий локально в разных магазинах. И приложение не может иметь простой, поэтому, если какие-либо проблемы с подключением, приложение должно работать. Затем файл будет синхронизирован с центральным сервером базы данных.

+0

Этот вид прокатки ваших собственных звуков звучит как абсолютно ужасная идея. Помимо всего прочего, вам придется защищать эти файлы, как-то иметь дело с транзакцией и координировать работу с несколькими экземплярами приложений, но не приносят никакой пользы (так как клиенты все равно должны иметь дело с другими сбоями). Просто верните ошибку 5xx. – chrylis

+0

(И просто используйте данные Spring для ваших DAO.) – chrylis

+0

@chrylis Я обновил вопрос с дополнительной информацией. Что касается вашего комментария. Для решения проблемы не существует. Под транзакцией вы имеете в виду при записи в файл? В этом случае координация не требуется, поскольку данные будут специфичными для хранилища. – HereToLearn

ответ

0

С весной у вас есть Hibernate ORM, который будет хранить данные в базе данных. Если исключение возникает во время любого запроса, оно будет отменено спящим режимом. Это зависит от того, где вы положили @Transnational annotation.

Мы используем сервисный уровень, который обрабатывает транзакцию. Поэтому, если операция базы данных или любая другая операция завершается сбоем на уровне службы и генерирует исключение, транзакция автоматически откатывается спящим режимом. Затем мы используем регенератор исключения Spring для обработки любого исключения и записи пользовательских ошибок в журнале и для пользователя. Я думаю, вы могли бы сохранить исключение в другой базе данных, если это интересно, я думаю, что их регистрация должна быть достаточной.

В этом article вы узнаете больше об общей обработке исключений.

Вот наш резольвер исключения.

import ... 

@ControllerAdvice 
public class SpringExceptionResolver { 

    Logger logger = LoggerFactory.getLogger("com.realitylabs.event.controller.RecoverController"); 


    @ExceptionHandler({CorruptedSessionUserException.class}) 
    @ResponseBody 
    @ResponseStatus(value=HttpStatus.FORBIDDEN) 
    public ErrorObject userNotFoundExceptionHandler() { 
     // Handle exception 
     // log using the logger. 
     // We usually return an error object in JSON so that we can show custom // error messages. 
    } 


} 

Вот как может выглядеть служба. Обычно мы называем наши сервисы от контроллеров. Если при выходе из контроллера возникает исключение, совет будет обрабатывать его.

import ... 

@Service(value="ObjectService") 
@Transactional 
public class ObjectServiceImpl implements ObjectService { 

    @Autowired 
    private ObjectDAO objectDAO; 

    @Override 
    public Object get(int id) { 
    Object o = objectDAO.get(id); 
    Hibernate.initialize(o.getVoters()); 
    return o; 
    } 

} 

Надеюсь, это поможет.

+0

Я прочитал статью, которую вы связали. Я считаю, что задача состоит в том, чтобы идентифицировать операции, выполняемые в службе, чтобы в файл могли быть записаны соответствующие операторы sql. Например, служба выполняет некоторые вставки, некоторые обновления и, если есть какая-либо проблема с подключением к базе данных, имеют одинаковые операции, но в файл. Таким образом, файл должен иметь одинаковые вставки и обновления. – HereToLearn

+0

Я не совсем понимаю, к чему вы клоните. Насколько критически важно ваше программное обеспечение? Это нормально, если запрос базы данных возвращает пользователю ошибку? Если это не так, вам может понадобиться архитектура вашей системы каким-то другим способом. Попробуйте объяснить более подробно, что вам нужно. Спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^