Вопрос

MySQL, похоже, имеет 8-часовой тайм-аут для своих подключений.Я запускаю несколько войн в Tomcat, используя Hibernate для ORM.Через 8 часов (т.е.ночь), я получаю сломанные трубы, когда он улавливает неработающее соединение.

Я уже проследил за кодом и вдвойне убедился, что фиксирую или откатываю все транзакции.

Вот мой hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
    <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
    <property name="hibernate.connection.password"></property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost/test</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
    <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <!--property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property-->

    <property name="c3p0.min_size">3</property>
    <property name="c3p0.max_size">5</property>
    <property name="c3p0.timeout">1800</property>
    <property name="c3p0.preferredTestQuery">SELECT 1</property>
    <property name="c3p0.testConnectionOnCheckout">true</property>
    <property name="c3p0.idle_test_period">100</property> <!-- seconds -->

    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    <property name="cache.use_query_cache">false</property>
    <property name="cache.use_minimal_puts">false</property>
    <property name="max_fetch_depth">10</property>

    <property name="hibernate.hbm2ddl.auto">update</property>

    <!-- classes removed -->

</session-factory>

Параметр, который, как я думал, исправил бы это, был c3p0.idle_test_period -- По умолчанию равно 0.Тем не менее, у нас все еще есть проблема со сломанной трубой после 8 часов работы.Хотя в Google индексируется несколько сообщений, ни одно из них не дает удовлетворительного ответа.

Это было полезно?

Решение

Итак, оказывается, мне не хватало ключевой строки, которая включала c3p0 (параметры c3p0, которые я настраивал, не имели никакого эффекта, потому что Hibernate использовал встроенный пул подключений, который, как он соответствующим образом предупреждает, не подходит для производства).В режиме гибернации 2.x, установив hibernate.c3p0.max_size свойство включило пул подключений c3p0.Однако в 3.x вы должны указать следующее свойство --

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

Кроме того, вот мои окончательные параметры конфигурации --

<property name="hibernate.c3p0.min_size">3</property>
<property name="hibernate.c3p0.max_size">5</property>
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.idle_test_period">100</property> <!-- seconds -->

Довольно прискорбно, что и Hibernate, и c3p0 имеют ужасную документацию на этот счет.

Другие советы

Здесь происходят две вещи.Вы должны прочитать эта статья для получения более подробной информации, но рекомендации на вынос следующие:

  1. Вы можете настроить MySQL время ожидания истекло при желании установите значение, превышающее 8 часов.
  2. Настройки гибернации должны включать "hibernate". перед "c3p0", например hibernate.c3p0.idle_test_period вместо того, чтобы просто c3p0.idle_test_period

Это решение, когда у вас неработающий канал из-за комбинации параметров tomcat wait_timeout = 28800 сек (8 ч) и maxIdleTime = 0 в c3p0:

Я изменил локальное время ожидания tomcat_timeout через мой файл.ini на 120 секунд (2 минуты).И я разместил следующее:
Максимальное время =100
idleConnectionTestPeriod=0 (такой же, как по умолчанию / как если бы он не существовал)
Другое:
Прирост к приобретению=2
Минимальный размер пула=2
Максимальный размер пула=5
Максимальное время выполнения соединений=10

У меня не было никаких проблем с этой настройкой.

Мне не нужно было использовать idleConnectionTestPeriod!

Если время ожидания tomcat равно 28800 секундам, а максимальное время ожидания равно 25200, это означает, что c3p0 закроет незанятое соединение на 3600 секунд (1 час) раньше, прежде чем tomcat выдаст исключение "неработающий канал".Разве это не так?!

Как вы можете видеть, у меня нет проблем с предоставлением только maxIdleTime.

К сожалению, эти:
Максимальное время ожидания
Тестовый период idleConnectionTestPeriod
конфигурирующее_соединение_тестирование
Проверка тестового подключения
не объясняйте слишком много угловых случаев.

И, кстати, вот как открыть файл tomcat my.ini с помощью Notepad ++:http://drupal.org/node/32715#comment-4907440

Ваше здоровье,
Деспот

У меня несколько проблем - - C3P0ConnectionProvider не найден - Я решаю ее, используя версию гибернации c3p0

        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>3.5.6-Final</version>
    </dependency>
          <!-- c3p0 -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-c3p0</artifactId>
        <version>3.3.1.GA</version>
    </dependency>

- У меня проблема с wait_timeout в mysql.Сначала я установил /etc/my.cnf wait_timeout=10 затем я изменил значение времени ожидания на меньшее, чем значение wait_timeout, которое < 10 Это решило мою проблему.

    <property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" /> <property name="hibernate.c3p0.acquire_increment" value="1" />
        <property name="hibernate.c3p0.idle_test_period"  value="28690"/>
        <property name="hibernate.c3p0.timeout" value="1800" />
        <property name="hibernate.c3p0.max_size" value="5" />
        <property name="hibernate.c3p0.min_size" value="3" />
        <property name="hibernate.c3p0.max_statement" value="50" />
        <property name="hibernate.c3p0.preferredTestQuery" value="select 1;"/>

Я столкнулся с той же проблемой, и потребовалось время, чтобы найти решение.

Я использую Hibernate 4.0.1 и mysql 5.1 (без spring framework), и я столкнулся с проблемой.Сначала убедитесь, что вы правильно настроили банки c3p0, которые необходимы.

Я использовал эти свойства в hibernate.cfg.xml

<property name="hibernate.c3p0.validate">true</property>
<property name="hibernate.connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.preferredTestQuery">SELECT 1;</property>
<property name="hibernate.c3p0.testConnectionOnCheckout">true</property>
<property name="hibernate.c3p0.idle_test_period">10</property>
<property name="hibernate.c3p0.acquireRetryAttempts">5</property>
<property name="hibernate.c3p0.acquireRetryDelay">200</property>
<property name="hibernate.c3p0.timeout">40</property>

Но это бесполезно, потому что C3p0 по-прежнему принимал свойства по умолчанию, а не те, которые я установил в hibernate.cfg.xml Вы можете проверить это в журналах.Итак, я искал правильное решение на многих веб-сайтах и, наконец, наткнулся на это.удалите свойства C3p0 в cfg.xml и создайте c3p0-config.xml в корневом каталоге (вместе с cfg.xml) и задайте свойства следующим образом.

<c3p0-config>
<default-config> 
<property name="automaticTestTable">con_test</property>
<property name="checkoutTimeout">40</property> 
<property name="idleConnectionTestPeriod">10</property> 
<property name="initialPoolSize">10</property>
<property name="maxPoolSize">20</property> 
<property name="minPoolSize">5</property> 
<property name="maxStatements">50</property>
<property name="preferredTestQuery">SELECT 1;</property>
<property name="acquireRetryAttempts">5</property>
<property name="acquireRetryDelay">200</property>
<property name="maxIdleTime">30</property>
</default-config>
</c3p0-config>

но если вы запустите, ORM примет соединение jdbc, но не пул соединений C3p0, потому что мы должны добавить эти свойства в hibernate.cfg.xml

<property name="hibernate.c3p0.validate">true</property>

<property name="hibernate.connection.provider_class">org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property>

теперь все работает нормально (по крайней мере, у меня это работало нормально), и проблема решена.

проверьте следующие ссылки на наличие ссылок.

http://www.mchange.com/projects/c3p0/index.html#configuring_connection_testing

https://community.jboss.org/wiki/HowToConfigureTheC3P0ConnectionPool

Я надеюсь, что это решит вашу проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top