我有一个使用Spring-EntityManager(JPA)的应用程序,我想知道如果数据库在我上述应用程序的生命周期中碰巧不可用会发生什么。
我希望在那种情况下,它会在第一次对数据库执行任何操作时抛出异常,对吗?
但是,我说等了10分钟然后再试一次,然后DB就回来了。它会恢复吗?我可以这样安排吗?
由于
答案 0 :(得分:7)
实际上,Spring和JPA都没有任何关系。在内部,所有持久性框架都只调用DataSource.getConnection()
并期望接收(可能是池化的)JDBC连接。一旦完成,他们close()
连接有效地将其返回到池中。
现在,当要求DataSource
提供连接但数据库无法使用时,它将引发异常。该异常将传播,并将以某种方式由您使用的任何框架处理。
现在回答您的问题 - 通常DataSource
实施(例如dbcp,c3p0等)将丢弃已知被破坏的连接并将其替换为新的连接。这实际上取决于提供者,但您可以放心地假设一旦数据库再次可用,DataSource
将逐渐摆脱生病的连接并用健康>替换它们em> ones。
此外,许多DataSource
实现者还提供了在连接返回客户端之前定期测试连接的方法。这在集合环境中很重要,其中DataSource
包含连接池,当数据库变得不可用时,它无法发现它。所以一些DataSource
的测试连接(通过调用SELECT 1
或类似的)在将其返回给客户端之前并且偶尔执行相同操作以消除断开的连接,例如由于底层TCP连接断开。
是,您将获得一个例外,并且是一旦数据库恢复,系统将正常工作。顺便说一句,你可以轻松测试这个!