Как отловить исключения c3p0 и JPA? - PullRequest
3 голосов
/ 07 августа 2011

Я получил это приложение, где пользователь должен подключить БД вручную, я делаю это с помощью этой строки

EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnit", connectionProperties);

когда пользователь / пароль неверен или тайм-ауты хоста из-за неправильного URL C3P0 разрывает соединение

тогда я получаю это в консоли

com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask, 1853 - A RESOURCE POOL IS PERMANENTLY BROKEN! [com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@18e3f02a]

ПРОБЛЕМА: Я не могу перехватить это исключение, поэтому я могу перевести его в удобное для пользователя сообщение на экране, как будто ЭМП всегда создается, и у меня нет способа узнать, когда он сломан или нет

ОБНОВЛЕНИЕ: Я нашел в Hibernate http://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/transactions.html#transactions-demarcation-exceptions

Но я окружил свою ЭМФ КАЖДОЙ возможной уловкой одной попытки и все еще не могу поймать вещь

Ответы [ 2 ]

0 голосов
/ 07 августа 2012

Я знаю, что это старая ветка.

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

Хорошо ... что происходит, так это то, что большая часть кода Hibernate перехватывает исключения и помещает их в локальное исключениеlist.

Например, взгляните на org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(), где он перехватывает все исключения jdbc и помещает их в список исключений.К сожалению, код, который использует этот класс, теряет отслеживание этих исключений, так как на объекты больше не ссылаются.

Хотя все исключения регистрируются в журнале ... но я считаю, что это поведение действительно раздражает, так как я урод управления.Идея помещения исключений в список очень хороша для фреймворка.Но если другой конец не может использовать это ... это просто раздувание кода, и это заставляет вас тратить время на анализ, почему вы не можете получить чертово исключение (для тех, кто никогда не сдается).

Что яdo выполняет некоторые базовые операции запуска базы данных, и когда я получаю исключение для запроса, я знаю, что что-то не так.Страница с ошибками в сервлете является более общей, но не создает у пользователя впечатления, что в системе много ошибок (хе-хе, это звучит неправильно).

Ах ... просто замечание.Это не проблема спецификации JPA (как сказал DataNucleus), поскольку, если вы используете собственную инициализацию hibernate, это то же самое.Хотя я действительно думаю, что в JPA отсутствуют исключения инициализации.

0 голосов
/ 08 августа 2011

В спецификации JPA говорится, что Persistence.createEntityManagerFactory вернет ноль, если не может быть создан экземпляр единицы постоянства (и ничего не говорится о возможных исключениях). Следовательно, он так же полезен, как шоколадный чайник для программного определения причины. Пожаловаться на людей, которые написали спецификацию JPA.

...