Spring-JPA EntityManager如何处理"破坏"的连接?

kki*_*fer 2 spring jpa entitymanager

我有一个使用Spring-EntityManager(JPA)的应用程序,我想知道如果数据库在我的上述应用程序的生命周期中恰好不可用会发生什么.

我希望在那种情况下它会在第一次对数据库做任何事情时抛出异常,对吗?

但是,比如我等了10分钟然后再试一次,然后DB回来了.它会恢复吗?我可以这样安排吗?

谢谢

Tom*_*icz 7

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

现在,当DataSource要求提供连接但数据库无法使用时,它将引发异常.该异常将传播,并将以某种方式由您使用的任何框架处理.

现在回答你的问题 - 通常DataSource实现(如,等)将丢弃已知被破坏的连接并用新的连接替换它.这实际上取决于提供者,但你可以放心地假设一旦数据库再次可用,DataSource它将逐渐摆脱生病的连接并用健康的连接替换它们.

此外,许多DataSource实现者还提供了在连接返回到客户端之前定期测试连接的方法.这在集合环境中很重要,其中DataSource包含一个连接池,当数据库变得不可用时,它无法发现它.所以一些DataSources测试连接(通过调用SELECT 1或类似)在将其返回给客户端之前并且偶尔执行相同操作以消除断开的连接,例如由于底层TCP连接断开.

TL; DR

是的,你会得到一个例外,的,一旦数据库恢复,系统将正常工作.顺便说一句,你可以轻松测试这个!