我使用 hibernate 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>

顺便提一句:创建了测试表,我得到了大量的调试输出 - 所以看起来它实际上读取了配置。

有帮助吗?

解决方案

那么它似乎BoneCP实际上已经实现了这个。它可以被设置为记录事务并重放它在网络或数据库故障:

HTTP:// jolbox.com/bonecp/downloads/site/apidocs/com/jolbox/bonecp/BoneCPConfig.html#setTransactionRecoveryEnabled(boolean)

其他提示

  

如果我没有记错,这是的东西连接池能为我做一个:是否有与数据库出了问题,只重试连接 - 在无限最坏的情况下

你错了。连接池是刚刚...一个连接池,它包含了数据库中的一些已经建立的物理连接,用来避免产生这些连接的开销,当你需要他们的一个。

这就是说,这些连接可能变得陈旧(例如,如果重新启动数据库)。幸运的是,大多数的连接池可以配置来测试连接是否仍然有效,之前他们再次向分发。 C3P0支持此功能在配置连接测试记载和你实际上已经在使用的各种选项之一。所以,当数据库会在您的连接应换新的。

但是,不要指望你的应用程序时,数据库关闭神奇地悬浮,池将无法做到这一点。

感谢您的回答。 看来我只是还没有真正理解该节末段 http://www.mchange.com/projects/c3p0/index.html# configuring_recovery

由于起初似乎C3P0能做到这一点(检测失效连接并重新获得了永恒连接,而没有引发异常的应用程序代码(当然,除非当涉及到SQL语句中的一个错误,而不是对的连接),但在最后一段 - 这是写在非常混乱的方式 - 它好像C3P0不能保证100%

所以我的解决办法是使对于i从所需的JDBC连接接口中的方法,其中尝试重新连接小包装,如果查询失败由于连接错误。当然,它有点哈克,因为我宁愿我的组件使用标准的连接接口,而不是我自己的接口,但至少它的现在干净的工作。

你忘记了:

  • 您已经开始的交易怎么样?
  • 已经发送到数据库的任何准备好的语句怎么样?
  • ETC

因此,您的应用程序必须重新启动事务。我能想到的唯一可能的方法是让连接池跟踪对连接句柄的每次调用,并在出现错误时重播这些调用,但这会大大减慢连接池的速度。

对于 BoneCP(http://jolbox.com),池通过首先捕获 JDBC 驱动程序抛出的异常并通过将该连接标记为错误或通过重新创建整个连接池来处理它来检测是否发生了故障。

编辑:现在正在处理中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top