我在多分片数据库环境中工作,其中分片的停机时间不是致命的事件。当应用程序启动时,所有分片信息都加载到缓存中并Session
加载相应的对象,但是,预计在应用程序正常运行期间,一些分片可能会关闭,在这种情况下,应用程序会故障转移到剩余的分片之一. 这几乎是一个标准的用例场景。
在某些情况下,我需要进行跨分片扫描,我这样做的方式是遍历上述会话映射并检索数据。当我有一个与数据库的休眠会话时,问题就出现了,该会话自会话打开以来同时出现故障。我想有一种先发制人的方式来检查数据库是否已关闭,而无需尝试进行事务并获取org.hibernate.exception.GenericJDBCException
,这是我现在发现它的方式,但这是不好的,因为它是运行时异常,以及所有其他弊端。我也尝试过Session.isOpen()
,Session.isConnected()
但即使数据库关闭,这两种方法都返回 true。
有没有办法先发制人地和优雅地检查 Hibernate Session 的连接性?诸如向数据库发送 ping 之类的东西。同样值得知道我们正在使用c3p0
连接池。有没有办法可以配置它来告诉 Hibernate 连接已关闭并关闭/断开关联的会话?