gpt4 book ai didi

java - hibernate c3p0破管

转载 作者:行者123 更新时间:2023-11-29 04:03:50 25 4
gpt4 key购买 nike

我将 hibernate 3 与 c3p0 一起用于一个不断从某些来源提取数据并将其写入数据库的程序。现在的问题是,数据库可能由于某些原因变得不可用(在最简单的情况下:我只是将其关闭)。

如果要将任何内容写入数据库,应该不会有任何异常 - 查询应该永远等待,直到数据库再次可用。如果我没记错的话,这是连接池可以为我做的事情之一:如果数据库有问题,只需重试连接 - 在最坏的情况下为无穷大。

但我却得到了一个破损的管道异常,有时紧随其后的是连接被拒绝,然后异常被传递到我自己的代码,这是不应该发生的。

即使我捕捉到异常,我如何才能再次干净地重新初始化 hibernate ? (到目前为止,在没有 c3p0 的情况下,我只是再次构建了 session 工厂,但如果这可能会泄漏连接(或者这样做是否可以?),我不会感到惊讶)。

数据库为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>

顺便说一句:测试表已创建,我得到大量调试输出 - 所以它似乎实际上读取了配置。

最佳答案

If I'm not mistaken this is one of the things the connection pool could do for me: if there is a problem with the db, just retry to connect - in the worst case for infinity.

你错了。连接池只是...一个连接池,它包含一些已经建立的与数据库的物理连接,用于避免在需要其中一个连接时创建这些连接的开销。

也就是说,这些连接可能会失效(例如,如果您重新启动数据库)。幸运的是,大多数连接池都可以配置为测试连接是否仍然有效并在分发它们之前更新它们。 c3p0 支持此功能,如 Configuring Connection Testing 中所述而且您实际上已经在使用各种选项之一。因此,当数据库恢复时,您的连接应该被更新。

但是不要指望您的应用程序会在数据库出现故障时神奇地暂停,池不会这样做。

关于java - hibernate c3p0破管,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1652676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com