Spring-JPA EntityManager如何处理"破坏"连接?

时间:2012-02-28 12:09:31

标签: spring jpa entitymanager

我有一个使用Spring-EntityManager(JPA)的应用程序,我想知道如果数据库在我上述应用程序的生命周期中碰巧不可用会发生什么。

我希望在那种情况下,它会在第一次对数据库执行任何操作时抛出异常,对吗?

但是,我说等了10分钟然后再试一次,然后DB就回来了。它会恢复吗?我可以这样安排吗?

由于

1 个答案:

答案 0 :(得分:7)

实际上,Spring和JPA都没有任何关系。在内部,所有持久性框架都只调用DataSource.getConnection()并期望接收(可能是池化的)JDBC连接。一旦完成,他们close()连接有效地将其返回到池中。

现在,当要求DataSource提供连接但数据库无法使用时,它将引发异常。该异常将传播,并将以某种方式由您使用的任何框架处理。

现在回答您的问题 - 通常DataSource实施(例如等)将丢弃已知被破坏的连接并将其替换为新的连接。这实际上取决于提供者,但您可以放心地假设一旦数据库再次可用,DataSource将逐渐摆脱生病的连接并用健康替换它们em> ones。

此外,许多DataSource实现者​​还提供了在连接返回客户端之前定期测试连接的方法。这在集合环境中很重要,其中DataSource包含连接池,当数据库变得不可用时,它无法发现它。所以一些DataSource的测试连接(通过调用SELECT 1或类似的)在将其返回给客户端之前并且偶尔执行相同操作以消除断开的连接,例如由于底层TCP连接断开。

TL; DR

,您将获得一个例外,并且一旦数据库恢复,系统将正常工作。顺便说一句,你可以轻松测试这个!