我在我的应用程序中使用了hibernate 3,c3p0 9.1.2,Oracle 11g。如果我重新启动Oracle,那么陈旧的连接不会得到刷新,我得到异常“java.sql.SQLRecoverableException:Closed Connection”。下面是我的hibernate.cfg.xml。
我是Hibernate API的初学者。您能否建议如何配置hibernate以在指定时间自动刷新陈旧连接。
这是我的hibernate.cfg.xml
oracle.jdbc.driver.OracleDriver JDBC:预言:瘦:@localhost:1521:EMS emsman
<property name="hibernate.c3p0.idle_test_period">60</property> <!-- seconds -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="show_sql">false</property>
<property name="dialect">org.hibernate.dialect.OracleDialect</property>
<property name="c3p0.validate">true</property>
<mapping resource="<package-name>/GroupOpWorkflow.hbm.xml"/>
<mapping resource="<package-name>/GroupOperation.hbm.xml"/>
<mapping resource="<package-name>/GroupOpNode.hbm.xml"/>
<mapping resource="<package-name>/NodeStatusLog.hbm.xml"/>
</session-factory>
答案 0 :(得分:3)
您的数据库连接池c3p0
,您需要配置 - 而不是休眠。尝试设置idleConnectionTestPeriod
和相应的preferredTestQuery
,例如select 1 from dual
。不推荐使用validate
属性,建议您不要使用它。
有关详细信息,请参阅http://community.jboss.org/wiki/HowToConfigureTheC3P0ConnectionPool。如果您在c3p0.properties
中创建WEB-INF/classes
文件,则可以获得最大的控制权,但是您需要确保不要覆盖hibernate.cfg.xml
中的这些属性。
答案 1 :(得分:1)
After gone through the document { http://community.jboss.org/wiki/HowToConfigureTheC3P0ConnectionPool } I found C3P0 was not a all used by hibernate.
So wrote a new C3P0 xml file and used the below system properties:
C3P0_SYS_PROPS="-Dcom.mchange.v2.c3p0.cfg.xml=<FILE-PATH>/c3p0-config.xml -Dcom.mchange.v2.log.MLog=com.mchange.v2.log.FallbackMLog -Dcom.mchange.v2.log.FallbackMLog.DE
FAULT_CUTOFF_LEVEL=WARNING"
So here is the final working configuration
hibernate.cfg.xml
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:ems</property>
<property name="hibernate.connection.username">emsman</property>
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.connection.autoReconnect">true</property>
<property name="show_sql">false</property>
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="hibernate.c3p0.idle_test_period">300</property> <!-- In seconds -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.max_statements">50</property>
.....
<c3p0-config>
<default-config>
<!-- Configuring Connection Testing -->
<!-- property name="automaticTestTable">TEST_EMS_HIBERNATE_CONN</property -->
<property name="checkoutTimeout">0</property>
<property name="testConnectionOnCheckout">true</property>
<property name="testConnectionOnCheckin">false</property>
<property name="preferredTestQuery">SELECT 1 from dual</property>
<!-- Configuring Recovery From Database Outages -->
<property name="acquireRetryAttempts">0</property>
<property name="acquireRetryDelay">1000</property>
<property name="breakAfterAcquireFailure">false</property>
<!-- Configuring to Debug and Workaround Broken Client Apps -->
<property name="unreturnedConnectionTimeout">1800</property>
<property name="debugUnreturnedConnectionStackTraces">true</property>
</default-config>
c3p0-config.xml
<c3p0-config>
<default-config>
<!-- Configuring Connection Testing -->
<!-- property name="automaticTestTable">TEST_EMS_HIBERNATE_CONN</property -->
<property name="checkoutTimeout">0</property>
<property name="testConnectionOnCheckout">true</property>
<property name="testConnectionOnCheckin">false</property>
<property name="preferredTestQuery">SELECT 1 from dual</property>
<!-- Configuring Recovery From Database Outages -->
<property name="acquireRetryAttempts">0</property>
<property name="acquireRetryDelay">1000</property>
<property name="breakAfterAcquireFailure">false</property>
<!-- Configuring to Debug and Workaround Broken Client Apps -->
<property name="unreturnedConnectionTimeout">1800</property>
<property name="debugUnreturnedConnectionStackTraces">true</property>
</default-config>
答案 2 :(得分:0)
您可以尝试以下操作,这是来自 c3p0 的作者的简单建议here:
<块引用>最好的办法通常是尝试第 3 步,看看是否有帮助 (无论你如何衡量性能),看看它是否受到伤害(是你的 应用程序受到连接断开的困扰?它恢复了吗 数据库重新启动是否足够好?),然后再决定。
第 3 步:
如果您想通过消除
来自客户端代码路径的连接测试:
将 testConnectionOnCheckout 设置为 false
将 testConnectionOnCheckin 设置为 true
将 idleConnectionTestPeriod 设置为 30,启动您的应用程序并 观察。这是一个非常强大的设置,所有连接都将被测试 在办理入住手续时以及此后在泳池中每 30 秒一次。您的 应用程序应该只遇到损坏或陈旧的连接 很少,并且池应该从数据库关闭中恢复并且 快速重启。但是有一些与所有相关的开销 连接测试。
如果数据库很少重启,那么快速恢复不是问题, 考虑通过 idleConnectionTestPeriod 减少测试频率 比方说,300,看看客户是否受到陈旧或损坏的困扰 连接。如果没有,请坚持使用 300,或者尝试更大的数字。 考虑将 testConnectionOnCheckin 设置回 false 以避免 不必要的签入测试。或者,如果您的应用程序 遇到坏连接,考虑减少 idleConnectionTestPeriod 并将 testConnectionOnCheckin 设置回 true。没有正确或 这些参数的值不正确:您正在权衡开销 以确定测试频率的可靠性。确切的数字 不是那么重要。通常很容易找到配置 表现良好。花时间去追求“最佳”是不值得的 值在这里。