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

Com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: после завершения подключения никаких действий не разрешено

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

Я изменил свой 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

Есть ли у кого-нибудь идеи, что может вызвать это поведение?

EDIT: Теперь я использую foleling в файле 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>
4b9b3361

Ответ 1

Как отметил @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:
Я обновил конфигурационный файл ( Ссылка), поскольку я только что скопировал его ранее для моего проекта. Тайм-аут в идеале должен решить проблему. Если это не сработает, существует дорогое решение, которое, я думаю, вы можете посмотреть:

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

# c3p0.properties
c3p0.testConnectionOnCheckout=true

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

Ответ 2

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

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

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

Ответ 3

Если вы не хотите использовать пул соединений (вы уверены, что ваше приложение имеет только одно соединение), вы можете это сделать - если соединение падает, вы должны установить новый метод one-call .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>

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

Ответ 4

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

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

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

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

Ответ 5

шаг 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';