我有一个使用 Spring-EntityManager (JPA) 的应用程序,我想知道如果数据库在上述应用程序的生命周期内不可用,会发生什么情况。
我预计在这种情况下它会在第一次对数据库执行任何操作时抛出异常,对吗?
但是,假设我等待 10 分钟,然后重试,数据库恰好恢复了。会恢复吗?我可以这样安排吗?
Thanks
实际上,Spring 和 JPA 都与此无关。在内部,所有持久性框架都简单地调用DataSource.getConnection() http://docs.oracle.com/javase/7/docs/api/javax/sql/DataSource.html#getConnection()并期望接收(可能是池化的)JDBC 连接。一旦他们完成了,他们close()
连接有效地将其返回到池中。
现在当DataSource
被要求提供连接但数据库不可用,它将引发异常。该异常将向上传播,并由您使用的任何框架以某种方式处理。
现在回答你的问题 - 通常DataSource
实施(如dbcp /questions/tagged/dbcp, c3p0 /questions/tagged/c3p0等)将丢弃已知已损坏的连接并用新的连接替换它。这实际上取决于提供商,但您可以放心地假设,一旦数据库再次可用,DataSource
会逐渐摆脱sick连接并将其替换为healthy ones.
还有很多DataSource
实现者提供了在连接返回给客户端之前定期测试连接的方法。这在池化环境中很重要,因为DataSource
包含一个连接池,当数据库变得不可用时,它无法发现它。所以一些DataSource
s 测试连接(通过调用SELECT 1
或类似的),然后将其返回给客户端,并偶尔执行相同的操作以消除断开的连接,例如由于底层 TCP 连接损坏。
TL;DR
Yes,你会得到一个异常并且yes数据库恢复后系统即可正常工作。顺便说一句,你可以轻松测试这个!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)