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