Spring Throwing CannotCreateTransactionException

Сценарий заключается в том, что я хочу обработать исключение, если БД выйдет из строя.

Я предполагал, что будет выброшено исключение DataAccessException. Однако вместо этого, когда я отключаю БД, исключение, которое я получаю из метода репозитория, - CannotCreateTransactionException. Это правильно.

Мое приложение - это приложение Spring CommandLine, и ниже приведен код того, как я получаю к нему доступ.

CustomerRepository cr = appContext.getBean(CustomerRepository.class);
    cr.exists(customerId);

Он работает так, как ожидалось, но когда БД не работает, почему он выбрасывает CannotCreateTransactionException. Или я неправильно понимаю DataAccessException.

Когда возникает исключение DataAccessException и когда возникает исключение CannotCreateTransactionException?

1
0
479
1

Ответы 1

Если вы проверите исходный код, вы увидите, что DataAccessException и его подклассы используются для обработки всех видов ошибок при доступе к данным в таблице, но не к базе данных. Подобно тому, как запись заблокирована другой транзакцией, будет какой-то DataAccessException.

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

Итак, я думаю, вы не можете указать, какое исключение будет выброшено при отключении БД.

Итак, в целом, как мне обрабатывать исключения БД? Скажем, например, я использую spring-retry, и мне нужно установить политики повтора на основе генерируемых исключений.?

Vipin Menon 30.05.2018 08:28

Если ваш доступ к БД или обновление не удалось. В большинстве случаев это связано с вашим бизнес-кодом, повторная попытка не имеет никакого значения. Обычно для такого ресурса, как БД, мы предполагаем, что он будет доступен все время. Если ваша БД слишком занята для обработки нового sql, вы должны проверить, есть ли какие-либо проблемы с SQL, которые вы пишете. Если нет, то вам нужно обновить вашу БД до более качественной серверной или распределенной. Если SQL не удалось выполнить из-за блокировки данных, проверьте код транзакции. Одним словом, повторная попытка доступа к БД только усугубит ситуацию.

Mavlarn 30.05.2018 10:13

Другие вопросы по теме