Hibernate JDBCExceptionReporter -> Срок действия подключения, время ожидания, автоматическое переподключение - PullRequest
2 голосов
/ 29 января 2011

У меня проблема с Hibernate (3.6.0.-Final) в моем приложении Java EE с использованием MySQL и MySQL Connector / J (официальный драйвер JDBC для MySQL).

В моем hibernate.cfg.xml есть следующие строки кода:

<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/mydbtest</property>
        <property name="connection.username">root</property>
        <property name="connection.password">mypassword</property>
        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">20</property>
        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- Enable Hibernate's automatic session context management, in this case 
             the session will be close after each transaction! -->
        <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>
        <!-- auto create tables -->
        <property name="hbm2ddl.auto">none</property>
        ...
    </session-factory>
</hibernate-configuration>

Я изменил значение свойства connection.pool_size с 1 на 20. Я сделал это, потому что кто-то сказал мне (и у меня были эти проблемы), что данные не были загружены и возникла ошибка с размером пула соединений. Также

Итак, я изменил значение на 20. но теперь я получаю эту ошибку:

Hibernate: select ...
WARN : org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 08S01
ERROR: org.hibernate.util.JDBCExceptionReporter - 
       The last packet successfully received from the server was 61.428.729 
       milliseconds ago.  The last packet sent successfully to the server was 
       61.428. milliseconds ago. is longer than the server configured value of 
       'wait_timeout'. You should consider either expiring and/or testing 
       connection validity before use in your application, increasing the server 
       configured values for client timeouts, or using the Connector/J 
       connection property 'autoReconnect=true' to avoid this problem.

Так, что я должен сделать из этих возможных решений? Как лучше всего решить эти проблемы с подключением JDBC? Я читаю о c3p0, но я новичок в пулах соединений. Я не понимаю проблему: у меня пул подключений 20. Так почему это не удается? Почему выкидываете исключение, а не открываете новое?

Большое спасибо заранее и наилучшими пожеланиями.

- Обновление -

<property name=“hibernate.c3p0.acquire_increment”>3</property>
<property name=“hibernate.c3p0.idle_test_period”>14400</property>
<property name=“hibernate.c3p0.timeout”>25200</property>
<property name=“hibernate.c3p0.max_size”>15</property>
<property name=“hibernate.c3p0.min_size”>3</property>
<property name=“hibernate.c3p0.max_statements”>0</property>
<property name=“hibernate.c3p0.preferredTestQuery”>select 1;</property>

- Обновление 2 -

/etc/my.cnf файл:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

1 Ответ

2 голосов
/ 29 января 2011

Обычно это происходит после некоторого времени бездействия, и MySQL закрыл соединение на стороне сервера. Но соединение на стороне клиента (ваше приложение) по-прежнему доступно, поэтому оно оказывается устаревшим.

Используя механизм пула подключений, он отвечает за открытие / закрытие подключений при необходимости, избегая подобных проблем. Как говорится в сообщении об ошибке, одним из решений является использование опции JDBC autoReconnect = true в URL. Другой способ - настроить механизм пула соединений для открытия / тестирования соединения перед его доставкой в ​​приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...