Подтвердить что ты не робот

Каковы требуемые настройки C3P0 для спящего режима, чтобы избежать блокировок

Я использую Hibernate вместе с MySQL 5.1.30.

У меня есть следующие библиотеки:

  • c3p0-0.0.1.2.jar
  • MySQL-разъем-Java-5.0.3-bin.jar
  • hibernate3.jar

Я использую hibernate.cfg.xml для конфигурации:

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">org.gjt.mm.mysql.Driver</property> 

        <property name="connection.url">jdbc:mysql://localhost/fooDatatbase</property>
    <property name="connection.username">foo</property>
    <property name="connection.password">foo123</property>

        <!-- Use the C3P0 connection pool provider -->
    <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_periods">3000</property>       

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Enable Hibernate automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <mapping resource="databaselayer/mail/Mail.hbm.xml"/>
        <mapping resource="databaselayer/courses/Course.hbm.xml"/>
        <mapping resource="databaselayer/price/Price.hbm.xml"/>        
        <mapping resource="databaselayer/contact/Contact.hbm.xml"/>
        <mapping resource="databaselayer/artists/Musician.hbm.xml"/>
        <mapping resource="databaselayer/concerts/Concert.hbm.xml"/>     
        <mapping resource="databaselayer/welcome/Welcome.hbm.xml"/>
        <mapping resource="databaselayer/information/Information.hbm.xml"/>                             
    </session-factory>
</hibernate-configuration>

В столбце JAVA с книгой hibernate объясняются параметры конфигурации c3p0:

  • hibernate.c3p0.min_size Это минимальное количество подключений JDBC, которые C3P0 всегда поддерживает.
  • hibernate.c3p0.max_size. Это максимальное количество подключений в пуле. Исключение возникает во время выполнения, если это число исчерпано.
  • hibernate.c3p0.timeout. Укажите период ожидания (в данном случае 300 секунд), после которого из пула удаляется свободное соединение.)
  • hibernate.c3p0.max_statements Максимальное количество операторов, которые будут кэшироваться. Кэширование подготовленных заявлений имеет важное значение для наилучшей работы с Hibernate.
  • hibernate.c3p0.idle_test_periods Это время iddle в секундах до того, как соединение будет автоматически проверено.

Я использую Java 1.5.0_09 и tomcat 6.0. У меня три приложения, развернутые в tomcat. Каждый из них использует hibernate с конфигурационным файлом, почти эквивалентным приведенному выше (только имя пользователя, имя_базы, пароль и изменение отображения изменяет).

К сожалению, с приведенными выше настройками, после нескольких часов работы я получаю несколько неприятных ошибок тупика, которые заканчивают убийство tomcat.

Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com[email protected]2437d -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com[email protected]1dc5cb7 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com[email protected]9cd2ef -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com[email protected]4af355 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com[email protected]1275fcb -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:35 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run

Это, кажется, ошибка, которую уже получили некоторые люди. Я изменил свои настройки, пытаясь следовать обходному пути, описанному здесь http://forum.hibernate.org/viewtopic.php?p=2386237, чтобы:

<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.min_size">0</property>
<property name="hibernate.c3p0.max_size">48</property>
<property name="hibernate.c3p0.timeout">0</property>
<property name="hibernate.c3p0.max_statements">0</property>

С новыми настройками я не получаю Deadlock, но получаю:

WARNING: SQL Error: 0, SQLState: 08S01
Jan 24, 2009 5:53:37 AM org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.io.EOFException

STACKTRACE:

java.io.EOFException
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913)

Кто-нибудь знает, что я делаю неправильно, и как я могу правильно настроить c3p0?

4b9b3361

Ответ 1

На самом деле это, вероятно, слишком поздно, но проблема довольно проста: hibernate.c3p0.idle_test_periods не должен быть выше hibernate.c3p0.timeout или соединения, закрытые базой данных, не будут обнаружены должным образом.

Кроме того, предупреждения об обнаружении тупиков выглядят так, что некоторая часть вашего кода неправильно возвращает соединения с пулом (т.е. session.close())

Исключения MysqlIO происходят, когда ваше приложение простаивает, а MySQL закрывает соединение на сервере. Теперь, если C3P0 неправильно проверяет, действительно ли соединение действительно связано, вы получаете EOFExceptions.

Я надеюсь, что это может быть полезно.

Ответ 2

Нет однозначного ответа на этот вопрос, поскольку он изменяется от приложения к приложению в зависимости от шаблона использования и загрузки.

Первая точка ссылается на ссылку https://www.hibernate.org/214.html, так как кажется, что вы сделали это и пошли дальше. вот несколько советов;

  • numHelperThreads: потоки помощников, которые не содержат заблокированных блокировок. Распространение этих операций на несколько потоков
  • maxStatements: размер глобального кэша PreparedStatement c3p0.
  • maxStatementsPerConnection: количество PreparedStatements c3p0 будет кэшироваться для одного объединенного соединения.
  • maxAdministrativeTaskTime: параметр, который заставляет вызов метода прерывания потока задачи(), если задача превышает установленный предел времени

Первый три параметра могут улучшить или уменьшить производительность на основе установленного значения, где в качестве четвертого параметра можно прервать поток после установленного лимита и дать возможность перейти к другому потоку.

Приблизительные значения

  • numHelperThreads = 6
  • maxStatements = 100
  • maxStatementsPerConnection = 12
  • maxAdministrativeTaskTime = требуется достаточное время, чтобы тяжелый запрос мог запускаться при производстве

maxStatements и maxStatementsPerConnection следует тестировать в течение нескольких месяцев, поскольку из-за этих параметров несколько точек отправки на мертвый замок.

Также ссылки на эти ссылки будут полезны;

Ответ 3

hibernate.c3p0.idle_test_periods должен быть меньше h * ibernate.c3p0.timeout *, потому что первый - это всего лишь значение времени, в котором hibernate проверяет свободные соединения и пытается закрыть его.

Между тем второй - это то, сколько времени требуется для извлечения соединения.

Если idle_test_periods больше, чем параметр тайм-аута, чем спящий режим, найдите все, что является нулевым или не существует в системе. По крайней мере, я понял это.

Ответ 4

Это довольно старая версия Connector/J. Чтобы убедиться, что вы не сражаетесь с известной и исправленной ошибкой, я бы начал с получения самой новой версии (5.0.8):

http://dev.mysql.com/downloads/connector/j/5.0.html

То, что EOFException из MysqlIO немного подозрительно. При нормальном/небедовом использовании вы никогда не должны получать ошибки с этого уровня.

Ответ 5

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

Ответ 6

    <property name="hibernate.c3p0.timeout">300</property>     
    <property name="hibernate.c3p0.idle_test_periods">3000</property>       
Значение

idle_test_period должно быть меньше, чем значение тайм-аута.