2013-11-22 3 views
0

Я разрабатываю веб-приложение в jee и получаю эту проблему только на сервере. Я использую tomcat 7, hibernate 2, mysql и c3p0 для управления соединением пула. Эта ошибка происходит в evertime.hibernate 2: mysql: ошибка записи сокета

nov. 22, 2013 3:51:07 PM net.sf.hibernate.util.JDBCExceptionReporter logExceptions 
WARNING: SQL Error: 0, SQLState: 08S01 
nov. 22, 2013 3:51:07 PM net.sf.hibernate.util.JDBCExceptionReporter logExceptions 
SEVERE: The last packet successfully received from the server was 232 158 milliseconds ago. The last packet sent successfully to the server was 232 158 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. 
nov. 22, 2013 3:51:07 PM net.sf.hibernate.JDBCException <init> 
SEVERE: Cannot open connection 
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 232 158 milliseconds ago. The last packet sent successfully to the server was 232 158 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.GeneratedConstructorAccessor92.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116) 
    at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3364) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1983) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2618) 
    at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:5000) 
    at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:912) 
    at net.sf.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:35) 
    at net.sf.hibernate.impl.BatcherImpl.openConnection(BatcherImpl.java:286) 
    at net.sf.hibernate.impl.SessionImpl.connect(SessionImpl.java:3326) 
    at net.sf.hibernate.impl.SessionImpl.connection(SessionImpl.java:3286) 
    at net.sf.hibernate.impl.BatcherImpl.prepareQueryStatement(BatcherImpl.java:65) 
    at net.sf.hibernate.loader.Loader.prepareQueryStatement(Loader.java:779) 
    at net.sf.hibernate.loader.Loader.doQuery(Loader.java:265) 
    at net.sf.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:133) 
    at net.sf.hibernate.loader.Loader.loadEntity(Loader.java:911) 
    at net.sf.hibernate.loader.Loader.loadEntity(Loader.java:931) 
    at net.sf.hibernate.loader.EntityLoader.load(EntityLoader.java:59) 
    at net.sf.hibernate.loader.EntityLoader.load(EntityLoader.java:51) 
    at net.sf.hibernate.persister.EntityPersister.load(EntityPersister.java:419) 
    at net.sf.hibernate.impl.SessionImpl.doLoad(SessionImpl.java:2117) 
    at net.sf.hibernate.impl.SessionImpl.doLoadByClass(SessionImpl.java:1991) 
    at net.sf.hibernate.impl.SessionImpl.load(SessionImpl.java:1920) 
    at com.apside.administration.C_User.GetUsersbyID(C_User.java:189) 
    at com.apside.connexion.Login.doPost(Login.java:72) 
    at com.apside.connexion.Login.doGet(Login.java:212) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1822) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.net.SocketException: Software caused connection abort: socket write error 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(Unknown Source) 
    at java.net.SocketOutputStream.write(Unknown Source) 
    at java.io.BufferedOutputStream.flushBuffer(Unknown Source) 
    at java.io.BufferedOutputStream.flush(Unknown Source) 
    at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3345) 
    ... 41 more 

вот моя конфигурация C3P0

<property name="hibernate.c3p0.min_size">5</property> 
    <property name="hibernate.c3p0.max_size">20</property> 
<property name="hibernate.c3p0.timeout">3000</property> 
<property name="hibernate.c3p0.max_statements">50</property> 
<property name="hibernate.c3p0.idle_test_period">300</property> 
<property name="current_session_context_class">thread</property> 
+1

Я думаю, вам нужно указать запрос теста соединения, который может использоваться C3P0, чтобы проверить, жив ли еще соединение: <свойство name = "hibernate.c3p0.preferredTestQuery"> выберите 1; – isnot2bad

ответ

0

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

Одной из причин является большой тайм-аут подключения в вашей конфигурации: 3000 секунд слишком велики, поэтому пул соединений будет поддерживать соединение намного дольше, чем сервер MySQL. Резко уменьшите его (например, до 100 или около того)!

Затем вы должны настроить тестовый запрос, который может использоваться C3P0, чтобы проверить, действительно ли соединение действительно действительное, прежде чем передать соединение. Это должен быть очень простой/эффективный SQL-запрос. Для MySQL вы можете использовать:

<property name="hibernate.c3p0.preferredTestQuery">select 1;</property> 

Обратите внимание, что MySQL также имеет специальный класс тестера соединений для C3P0. Вы можете настроить C3P0 использовать этот класс, чтобы проверить открытые соединения:

<property name="hibernate.c3p0.connectionTesterClassName">com.mysql.jdbc.integration.c3p0.MysqlConnectionTester</property> 

Это должно быть более эффективным, чем общий подход с использованием тестового запроса. Поэтому, если он работает, вы можете пропустить свойство тестового запроса.

+0

Я уже использую autoReconnect = true. Btw я постараюсь установить тайм-аут на 100. Я читал, что тайм-аут должен быть выше периода ожидания. – user2064769

Смежные вопросы