如何捕获c3p0和JPA异常?

时间:2011-08-07 06:01:11

标签: hibernate jpa c3p0

我有这个应用程序,用户必须手动连接数据库,我用这行

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

当用户/密码不正确或由于错误的网址C3P0导致的主机超时时断开连接

然后我在控制台中得到这些

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

问题:我无法捕获该异常,因此我可以将其转换为屏幕上的用户友好消息,就像emf总是被创建一样,我无法判断什么时候坏了

更新:我在Hibernate http://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/transactions.html#transactions-demarcation-exceptions

上找到了

但我把我的电动车包围着,每次尝试捕捉都可能,但仍然无法捕捉到一件事

2 个答案:

答案 0 :(得分:0)

JPA规范说如果无法实例化持久性单元,那么 Persistence.createEntityManagerFactory 将返回null(并且没有说明可能的异常)。因此,它与巧克力茶壶一样用于以编程方式检测原因。抱怨撰写JPA规范的人。

答案 1 :(得分:0)

我知道这是一个老话题。

但我试图和你完全一样。 我做了一个很大的搜索,找不到答案,即使你很久以前发布了这个并没有得到答案。

嗯..发生的事情是大多数Hibernate代码捕获异常并将其放入本地异常列表中。

例如,查看org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(),它捕获所有jdbc异常并将它们放在例外列表中。 不幸的是,使用此类的代码会丢失对这些异常的跟踪,因为不再引用这些对象。

虽然记录了所有异常..但我发现这种行为真的很烦人,因为我是一个控制狂。将异常放在列表上的想法对于框架非常有用。但如果另一端不能使用它......它只是代码臃肿而且它让你浪费时间分析为什么你不能得到该死的例外(对于那些从不放弃的人)。

我所做的是对数据库执行一些基本的启动操作,当我收到查询异常时,我就知道出了什么问题。 servlet中的错误页面更通用,但不会给用户一个系统有很多错误的印象(呵呵,这听起来不对)。

啊,只是一句话。这不是JPA规范问题(如DataNucleus所说),因为如果你使用hibernate的本机初始化,它就是一样的。虽然我真的认为JPA缺少初始化异常。