Обработка связанных с базой данных исключений в Java / Spring - PullRequest
1 голос
/ 03 марта 2010

Я читаю книгу Весенние рецепты прямо сейчас, и меня озадачивает одна вещь: любые исключения вызываются как подкласс DataAccessException, RuntimeException, который вы не должны пытаться поймать.

Что меня беспокоит, так это проблемы, которые более вероятны, особенно со вставками. Если вы используете что-то вроде SimpleJdbcTemplate, каждый запрос является отдельной транзакцией, поэтому вы не можете убедиться, что ключ отсутствует в таблице, тогда вставьте его с помощью getSimpleJdbcTemplare.update (), поскольку ключ мог быть вставлен между двумя запросами. .

Очевидно, что это то, что хотелось бы обрабатывать более изящно, чем RuntimeException в производственной системе. Так как вы справляетесь с этим?

Спасибо.

1 Ответ

2 голосов
/ 03 марта 2010

RuntimeException, для которого вы не предназначены попробовать / поймать.

Говорит кто? У вас нет , чтобы поймать RuntimeException, но ничто не мешает вам это сделать, это вполне приемлемо. Например, существует подкласс DataAccessException, называемый RecoverableDataAccessException, который специально предназначен для перехвата, чтобы можно было попытаться повторить попытку. Также есть OptimisticLockingFailureException, который решает вашу следующую проблему транзакционных конфликтов из-за оптимистической блокировки, а также может специально обрабатываться приложением.

Если вы используете что-то вроде SimpleJdbcTemplate каждый запрос является его собственная транзакция

Не правда. Если вы используете транзакционную семантику Spring , тогда SimpleJdbcTemplate (или любой используемый вами компонент DAO) будет участвовать в транзакции с полной семантикой ACID, если ее поддерживает база данных и управление транзакциями (что большинство должно). В случае вашего примера вы можете выполнить select for update (или то, что поддерживает ваша база данных) после insert, все в одной транзакции.

Уровень доступа к данным Spring, вероятно, является его лучшей функцией, но он редко получает за это кредит.

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