2012-02-28 158 views
2

我有一个使用Spring-EntityManager(JPA)的应用程序,我想知道如果数据库恰好在我上述应用程序的生命周期中不可用,会发生什么情况。Spring-JPA EntityManager如何处理“断开”连接?

我期望在这种情况下,它会在第一次抛出异常来处理数据库上的任何事情,对吗?

但是,比如我等了10分钟,然后再试一次,数据库恰好回来了。它会恢复吗?我可以安排它吗?

谢谢

回答

7

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

现在,当要求DataSource提供连接但数据库不可行时,它将引发异常。这个异常会传播出去,并以某种方式被你使用的任何框架处理。

现在要回答你的问题 - 通常DataSource执行(如等)将丢弃已知被断开的连接并将其替换为新的连接。这实际上取决于提供商,但可以放心地假设一旦数据库再次可用,DataSource将逐渐摆脱生病连接并将其替换为健康个人。

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

TL; DR

,你会得到一个例外,系统通常一旦数据库又回来工作。顺便说一句,你可以轻松测试这个!

+0

谢谢,那正是我一直在寻找的。 – kkiefer 2012-02-28 13:33:15