我正在将休眠 3 与 c3p0 一起用于一个程序,该程序不断地从某个源中提取数据并将其写入数据库。现在的问题是,数据库可能由于某些原因变得不可用(在最简单的情况下:我只是将其关闭)。
如果任何内容即将写入数据库,则不应出现任何异常 - 查询应一直等待,直到数据库再次可用。如果我没记错的话,这是连接池可以为我做的事情之一:如果数据库有问题,只需重试连接——在最坏的情况下是无穷大。
但相反,我得到了一个损坏的管道异常,有时随后是连接被拒绝,然后异常被传递给我自己的代码,这不应该发生。
即使我捕捉到异常,我怎么能再次干净地重新初始化休眠?(到目前为止,在没有 c3p0 的情况下,我只是再次构建了会话工厂,但如果这会泄漏连接(或者这样做可以吗?),我不会感到惊讶。
该数据库是 Virtuoso 开源版本。
我的 hibernate.xml.cfg c3p0 配置:
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.breakAfterAcquireFailure">false</property>
<property name="hibernate.c3p0.acquireRetryAttempts">-1</property>
<property name="hibernate.c3p0.acquireRetryDelay">30000</property>
<property name="hibernate.c3p0.automaticTestTable">my_test_table</property>
<property name="hibernate.c3p0.initialPoolSize">3</property>
<property name="hibernate.c3p0.minPoolSize">3</property>
<property name="hibernate.c3p0.maxPoolSize">10</property>
顺便说一句:创建了测试表,我得到了大量的调试输出 - 所以它似乎实际上读取了配置。