代码之家  ›  专栏  ›  技术社区  ›  Paralife

当调用opensession并且无法建立到db的连接时,Hibernate不引发异常

  •  6
  • Paralife  · 技术社区  · 15 年前

    当我将Hibernate配置为连接到数据库时,由于某种原因连接失败,我注意到在构建工厂(这是可接受的)或调用sessionFactory.opensession()(这是不可接受的)时,它都不会抛出任何异常。更烦人的是,在调用sessionFactory.opensession()之后,session.isconnected()返回true。(完全不可接受)。

    到那一刻为止,唯一告诉我它还没有连接到数据库的提示是由java.sql.sqlException引起的一个警告日志条目,它在内部捕获并发送到记录器。除了创建一个伪事务来强制异常之外,还有其他方法来获取连接状态吗?(配置中可能有一个选项说“不要记录失败的连接尝试,而是抛出一个休眠异常”)。我找过了,但什么也没找到。谢谢。

    3 回复  |  直到 15 年前
        1
  •  3
  •   ChssPly76    15 年前

    您使用的连接池是什么?Hibernate的内置游泳池 should not be used 除了简单的测试。

    Proxool 另一方面,它允许你做你想做的事情:设置 test-before-use 属性设置为true,如果找不到或无法创建合适的连接,它将引发异常。你甚至可以 listen to connection events 如果你愿意的话。

        2
  •  3
  •   aperkins    15 年前

    正如CHSSPLY所提到的,您不应该将Hibernate的内置池用于任何事情。除proxool之外的另一个选项(我没有亲自使用过,因此我不能亲自担保)是 C3P0 . 在设置连接池时,它肯定会抛出一个异常——我可以保证:)因为这是我希望应用程序使用的行为,它非常适合我们。

        3
  •  0
  •   Paralife    15 年前

    很抱歉重新提出这个问题,但是:我尝试了c3p0,它比内置的要好,但是就我的问题而言,它与普通的休眠没有任何不同:如果它不能获得连接,它会抛出异常,Hibernate会捕获该异常,然后再次对我隐藏它。通过使用c3p0,我仍然使用hibernate API,无论c3p0抛出什么,它都会被hibernate吸走。唯一的方法是通过编程的方式实例化c3p0数据源,如果没有抛出异常(我可以捕捉到这个异常),那么将它传递给休眠。但后来我意识到,要将数据源传递给Hibernate,只能通过JNDIURL来完成,这不是一个选项。所以我最后的希望是实现自定义连接提供程序,在内部使用c3p0并在其中捕获c3p0的异常。还有其他选择吗?

    请注意,我没有尝试procool,因为它似乎很难配置Hibernate,尽管我自己没有给它一个公平的机会。另外,很抱歉在彻底测试之前给出了答案。