com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: операции не допускаются после закрытия соединения - PullRequest
42 голосов
/ 27 сентября 2011

Я создал приложение и развернул его локально ... и он работал отлично.Я развернул его на удаленном сервере и начал получать исключение, упомянутое в строке темы.Это не из-за каких-либо проблем с брандмауэром.

Я изменил свой hibernate.xml для подключения через свой IP-адрес, а не через localhost, и теперь я получаю такие же тайм-ауты для локально развернутого приложения.Я получаю эту ошибку, когда поддерживаю приложение более одного дня.

Я не выполняю никаких операций после совершения транзакций или закрытия сеансов самостоятельно.Я использую следующие свойства в hibernate.cfg.xml

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://myremotehost:3306/akp</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.show_sql">false</property>
        <property name="hibernate.current_session_context_class">thread</property>
        <property name="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</property>

. Вызывается: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Никакие операции не допускаются после закрытия соединения. Соединение было неявно закрытодрайвер.

Подробно:

 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed by the driver.
      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
      at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
      at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
      at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
      at com.mysql.jdbc.Util.getInstance(Util.java:384)
      at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
      at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
      at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
      at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
      at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1193)
      at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1180)
      at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4137)
      at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4103)
      at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:505)
      at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:423)
      at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
      at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)
      at org.hibernate.loader.Loader.doQuery(Loader.java:673)
      at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
      at org.hibernate.loader.Loader.doList(Loader.java:2220)
      ... 36 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 34,247,052 milliseconds ago.  The last packet sent successfully to the server was 34,247,052 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.
      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
      at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
      at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
      at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
      at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1118)
      at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3321)
      at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1940)
      at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
      at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)
      at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113)
      at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2275)
      at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
      at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
      at org.hibernate.loader.Loader.doQuery(Loader.java:674)
      at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
      at org.hibernate.loader.Loader.doList(Loader.java:2220)
      at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
      at org.hibernate.loader.Loader.list(Loader.java:2099)
      at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
      at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569)
      at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
      at com.xyz.abc.DAO.GenericHibernateDAO.findByField(GenericHibernateDAO.java:119)
      at com.xyz.abc.DAO.JobDAO.getJobsByLdap(JobDAO.java:115)
      at com.xyz.abc.business.Jcr.getMyruns(Jcr.java:272)
      at com.xyz.abc.business.abcService.getMyruns(abcService.java:54)
      at sun.reflect.GeneratedMethodAccessor139.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:194)
      at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:102)
      at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
      at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114)
      at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:173)
      at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:173)
      at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:142)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:203)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
      at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:242)
      at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259)
      at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:237)
      ... 4 more
Caused by: java.net.SocketException: Software caused connection abort: socket write error

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

РЕДАКТИРОВАТЬ: сейчас используюв моем файле hibernate.cfg.xml. Это правильно?

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/xyz</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>
    <property name="hibernate.show_sql">false</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</property>
    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">20</property>
<!-- <property name="hibernate.c3p0.max_size">1800</property>-->
    <property name="hibernate.c3p0.max_statements">50</property>

    <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
    <property name="c3p0.max_statements">0</property>
    <property name="c3p0.maxIdleTimeExcessConnections">3600</property>
    <property name="c3p0.idleConnectionTestPeriod">3600</property> 
    <property name="c3p0.maxIdleTime">3600</property>

Ответы [ 5 ]

21 голосов
/ 01 октября 2011

Как заметил @swanliu, это связано с плохой связью.
Однако, прежде чем настраивать время сервера и время ожидания клиента, я сначала попробую использовать более эффективную стратегию пулов соединений.

Пул подключений

Сам Hibernate признает, что его стратегия пула подключений минимальна

Однако собственный алгоритм пула соединений Hibernate довольно в зачаточном состоянии. Он призван помочь вам начать работу и не предназначен для использования в производственной системе или даже для производительности тестирование. Вы должны использовать сторонний пул для лучшей производительности и стабильность. Просто замените свойство hibernate.connection.pool_size с конкретными настройками пула соединений. Это отключит Hibernate's внутренний бассейн. Например, вы можете использовать c3p0.
Как указано в ссылке : http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html

Я лично использую C3P0. Однако есть и другие альтернативы, включая DBCP.
Проверить

Ниже приведена минимальная конфигурация C3P0, используемая в моем приложении:

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="c3p0.acquire_increment">1</property> 
<property name="c3p0.idle_test_period">100</property> <!-- seconds --> 
<property name="c3p0.max_size">100</property> 
<property name="c3p0.max_statements">0</property> 
<property name="c3p0.min_size">10</property> 
<property name="c3p0.timeout">1800</property> <!-- seconds --> 

По умолчанию у пулов никогда не истекает Соединения. Если хочешь Срок действия соединений истекает, чтобы сохранить «свежесть», установить maxIdleTime и / или maxConnectionAge. maxIdleTime определяет сколько секунд Соединение должно быть разрешено не использовать до того, как отбракован из бассейна. maxConnectionAge заставляет пул отбраковывать любые Соединения, которые были получены из базы данных больше, чем установлено количество секунд в прошлом.
Как указано в ссылке: http://www.mchange.com/projects/c3p0/index.html#managing_pool_size

Edit:
Я обновил файл конфигурации ( Reference ), так как я только что скопировал и вставил файл для моего проекта ранее. В идеале тайм-аут должен решить проблему. Если это не сработает для вас, есть дорогое решение , которое, я думаю, вы могли бы посмотреть:

Создайте файл «c3p0.properties», который должен находиться в корне пути к классам (т. Е. Нет возможности переопределить его для определенных частей приложения). ( Ссылка )

# c3p0.properties
c3p0.testConnectionOnCheckout=true

В этой конфигурации каждое соединение проверяется перед использованием. Однако это может повлиять на производительность сайта.

17 голосов
/ 27 сентября 2011

MySQL неявно закрыл соединение с базой данных, поскольку соединение было неактивным слишком долго (34 247 052 ​​миллисекунд ≈ 9,5 часов).Если ваша программа затем получает плохое соединение из пула соединений, что вызывает MySQLNonTransientConnectionException: No operations allowed after connection closed.

MySQL предлагает:

Вы должны рассмотреть либо истечение срока действия и / или тестированиедопустимость соединения перед использованием в вашем приложении, увеличивая сконфигурированные сервером значения времени ожидания клиента, или используя свойство соединения Connector / J autoReconnect=true, чтобы избежать этой проблемы.

1 голос
/ 28 ноября 2013

Если вы не хотите использовать пул соединений (вы уверены, что ваше приложение имеет только одно соединение), вы можете сделать это - если соединение падает, вы должны установить новый метод вызова - 1001 * .openSession () вместо .getCurrentSession ()

Например:

SessionFactory sf = null;
// get session factory
// ...
//
Session session = null;
try {
        session = sessionFactory.getCurrentSession();
} catch (HibernateException ex) {
        session = sessionFactory.openSession();
}

Если вы используете Mysql, вы можете установить autoReconnect свойство:

    <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/database?autoReconnect=true</property>

Надеюсь, это поможет.

0 голосов
/ 10 декабря 2018
  1. Сначала замените зависимость MySQL, как указано ниже

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.44</version>
    </dependency>
    
  2. Появится сообщение об ошибке «Плагин аутентификации caching_sha2_password».Запустите эту команду:

    mysql -u root -p
    ALTER USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
    
0 голосов
/ 24 июня 2018

Пожалуйста, убедитесь, что вы используете последний разъем JDBC в соответствии с MySQL.Я столкнулся с этой проблемой, и когда я заменил мой старый разъем jdbc на последний, проблема была решена.

Вы можете загрузить последнюю версию драйвера jdbc с https://dev.mysql.com/downloads/connector/j/

Выбрать работающийСистема как Платформа Независимая.Он покажет вам два варианта.Один как смола, а другой как почтовый индекс.Загрузите zip-архив и распакуйте его, чтобы получить файл jar и замените его старым соединителем.

Это не только для Hibernate Framework, его можно использовать с любой платформой, для которой требуется разъем JDBC.

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