【问题标题】:How to catch c3p0 and JPA exceptions?如何捕获 c3p0 和 JPA 异常?
【发布时间】:2011-08-07 06:01:11
【问题描述】:

我有这个应用程序,用户必须手动连接数据库,我用这条线来做

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]

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

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

但是我用每一次可能的尝试捕获包围了我的 emf,但仍然无法捕获任何东西

【问题讨论】:

  • 有人可以确认我的问题可以理解吗?我不敢相信以前没有人发现自己在这个案子上

标签: hibernate jpa c3p0


【解决方案1】:

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

【讨论】:

  • 希望它返回 null,因为我可以捕获一个空指针异常,但不是,它返回一个活动的、打开的实体管理器,它指向一个损坏的资源......
  • 您的意思是 EntityManagerFactory,而不是 EntityManager,是吗? DataNucleus JPA 实际上会在您的特定情况下引发 PersistenceException,因此是可以检测到的。
  • 是的,我的意思是 emf,好的,我会看看 DataNucleus
【解决方案2】:

我知道这是一个旧线程。

但我想和你做的完全一样。 搜了一大圈也没找到答案,你发了很久也没找到答案。

嗯.. 大多数 Hibernate 代码会捕获异常并将其放入本地异常列表中。

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

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

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

啊..只是一个评论。这不是 JPA 规范问题(如 DataNucleus 所说),因为如果您使用 hibernate 的本机初始化,它是一样的。虽然我真的认为 JPA 缺乏初始化异常。

【讨论】:

  • 那是很多文字,你能把实际答案加粗吗? :)
  • 不是一个真正的答案.. 只是对为什么 你实际上不能做 @javaNoober 试图做的事情的一个小解释......在这种情况下,特别是 Hibernate。但是你是对的。。
猜你喜欢
  • 2015-02-09
  • 2013-06-24
  • 1970-01-01
  • 2017-03-14
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多