Восстановление соединения БД после сбоя сети - Hibernate - PullRequest
2 голосов
/ 10 ноября 2011

Привет всем, Я использую спящий ORM и базу данных Oracle. Мой файл cfg имеет следующие свойства:

    <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    <property name="connection.url">jdbc:oracle:thin:@url</property>
    <property name="connection.username">username</property>
    <property name="connection.password">pasword</property>
    <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>                

    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">20</property>
    <property name="hibernate.c3p0.timeout">300</property>
    <property name="hibernate.c3p0.max_statements">50</property>
    <property name="hibernate.c3p0.idle_test_period">3000</property>    
    <property name="hibernate.c3p0.acquire_increment">3</property>

Все работает нормально, но когда я запускаю приложение и когда я отключаю сетевой кабель и подключаю его снова, мои запросы к БД не выполняются. Это дает мне ошибку

java.sql.SQLException: Io exception: Connection reset by peer: socket write error

Есть ли способ восстановить соединение?

Ответы [ 2 ]

2 голосов
/ 10 ноября 2011

Вам необходимо настроить пул соединений с базой данных, а не спящий режим. Попробуйте установить idleConnectionTestPeriod и соответствующий preferredTestQuery, например, select 1 from dual.

См. Как настроить C3P0 ConnectionPool для получения дополнительной информации. Вы получите максимальный контроль, если создадите файл c3p0.properties в WEB-INF/classes, но вам нужно убедиться, что вы не переопределите эти свойства в hibernate.cfg.xml.

.

Ну, я написал 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>

и системные свойства, такие как:

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"

0 голосов
/ 10 ноября 2011

Как я вижу, вы указали при тестировании соединения, но не указали, как их тестировать. Прочитайте это http://www.mchange.com/projects/c3p0/index.html#configuring_connection_testing. Я полагаю, вам нужно просто добавить preferredTestQuery, обычно это что-то вроде SELECT 1 FROM DUAL. Также читайте здесь Что-то не так с пулером подключения к базе данных Hibernate c3p0

...