Oracle 如何在hibernate中配置c3p0以自动刷新过时的数据库连接

Oracle 如何在hibernate中配置c3p0以自动刷新过时的数据库连接,oracle,hibernate,c3p0,Oracle,Hibernate,C3p0,我正在应用程序中使用Hibernate3、C3P09.1.2和Oracle11g。如果我重新启动Oracle,则过时的连接不会得到刷新,并且会得到异常java.sql.SQLRecoverableException:Closed Connection。下面是我的hibernate.cfg.xml 我是HibernateAPI的初学者。您能否建议如何配置hibernate以在指定时间自动刷新过时的连接 这是我的hibernate.cfg.xml oracle.jdbc.driver.Orac

我正在应用程序中使用Hibernate3、C3P09.1.2和Oracle11g。如果我重新启动Oracle,则过时的连接不会得到刷新,并且会得到异常java.sql.SQLRecoverableException:Closed Connection。下面是我的hibernate.cfg.xml

我是HibernateAPI的初学者。您能否建议如何配置hibernate以在指定时间自动刷新过时的连接

这是我的hibernate.cfg.xml

oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@localhost:1521:ems 舵手

<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>
您需要配置的是c3p0,即您的数据库连接池,而不是休眠。尝试设置IDLECONNECTONTESTPERIOD和适当的preferredTestQuery,例如,从dual中选择1。validate属性已被弃用,建议您不要使用它

有关更多信息,请参阅。如果在WEB-INF/classes中创建c3p0.properties文件,您将获得最大的控制权,但您需要确保不要覆盖hibernate.cfg.xml中的那些属性。

您需要配置的是c3p0,即数据库连接池,而不是hibernate。尝试设置IDLECONNECTONTESTPERIOD和适当的preferredTestQuery,例如,从dual中选择1。validate属性已被弃用,建议您不要使用它


有关更多信息,请参阅。如果在WEB-INF/classes中创建c3p0.properties文件,您将获得最大的控制权,但您需要确保不要覆盖hibernate.cfg.xml中的这些属性。

您可以尝试以下方法,这是c3p0作者的一个简单建议:

最好的做法通常是尝试第3步,看看是否有帮助 无论你如何衡量绩效,看看它是否伤害了你的工作 应用程序被断开的连接困扰?它恢复了吗 数据库重新启动是否足够好?然后决定

步骤3:如果您想通过消除 从客户端的代码路径进行连接测试:

将TestConnectionOnOnCheckout设置为false

将testConnectionOnCheckin设置为true

将idleConnectionTestPeriod设置为30,启动应用程序并 看到这是一个非常健壮的设置,所有连接都将进行测试 在登记入住时以及之后在游泳池中每30秒一次。你的 应用程序只会遇到断开或陈旧的连接 很少,并且池应该从数据库关闭和 快速重启。但所有这些都会带来一些开销 连接测试

如果数据库很少重新启动,那么快速恢复不是问题, 考虑通过IDelnOnnIn测试周期减少测试频率 比如说,300美元,看看客户是因为陈旧还是破损而烦恼 连接。如果不是,坚持300,或者尝试更大的数字。 考虑将TestCalnOngReTCKIN设置为false以避免 不必要的签入测试。或者,如果您的应用程序 遇到坏连接,考虑减少IDelnOnnRead测试周期 并将TestConnectionOnOnCheckin设置回true。没有正确或正确的答案 这些参数的值不正确:您正在权衡开销 用于确定测试频率的可靠性。确切数字 这些都不是那么关键。通常很容易找到 表现良好。很少值得花时间去追求最佳效果 这里的值


您可以尝试以下方法,这是c3p0作者的一个简单建议:

最好的做法通常是尝试第3步,看看是否有帮助 无论你如何衡量绩效,看看它是否伤害了你的工作 应用程序被断开的连接困扰?它恢复了吗 数据库重新启动是否足够好?然后决定

步骤3:如果您想通过消除 从客户端的代码路径进行连接测试:

将TestConnectionOnOnCheckout设置为false

将testConnectionOnCheckin设置为true

将idleConnectionTestPeriod设置为30,启动应用程序并 看到这是一个非常健壮的设置,所有连接都将进行测试 在登记入住时以及之后在游泳池中每30秒一次。你的 应用程序只会遇到断开或陈旧的连接 很少,并且池应该从数据库关闭和 快速重启。但所有这些都会带来一些开销 连接测试

如果数据库很少重新启动,那么快速恢复不是问题, 考虑通过IDelnOnnIn测试周期减少测试频率 比如说,300美元,看看客户是因为陈旧还是破损而烦恼 连接。如果不是,坚持300,或者尝试更大的数字。 考虑将TestCalnOngReTCKIN设置为false以避免 不必要的签入测试。或者,如果您的应用程序 遇到坏连接,考虑减少IDelnOnnRead测试周期 并将TestConnectionOnOnCheckin设置回true。没有正确或正确的答案 这些参数的值不正确:您正在进行交易 公元 用于确定测试频率的可靠性。确切数字 这些都不是那么关键。通常很容易找到 表现良好。很少值得花时间去追求最佳效果 这里的值


谢谢你,李。我可以将c3p0.properties文件路径指定为java系统属性,或者在应用程序启动期间加载属性。hibernate会覆盖c3p0.properties属性吗?我相信hibernate会覆盖c3p0.properties。您不需要手动加载c3p0.properties文件,只需确保它在正确的位置可见,并且它会自行配置。谢谢。我可以将c3p0.properties文件路径指定为java系统属性,或者在应用程序启动期间加载属性。hibernate会覆盖c3p0.properties属性吗?我相信hibernate会覆盖c3p0.properties。您不需要手动加载c3p0.properties文件,只需确保它在正确的位置可见,并且它会自行配置。
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>