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