JPA断开与MYSQL的连接[重复]

Posted

技术标签:

【中文标题】JPA断开与MYSQL的连接[重复]【英文标题】:JPA Disconnect to MYSQL [duplicate] 【发布时间】:2016-09-03 05:28:53 【问题描述】:

例外:

从服务器成功接收到的最后一个数据包是 2,405,585 毫秒前。最后一个成功发送到服务器的数据包是 30,340 毫秒前。 javax.persistence.PersistenceException:org.hibernate.exception.JDBCConnectionException:无法提取 结果集 警告:org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL 错误:0,SQLState:空 错误:org.hibernate.engine.jdbc.spi.SqlExceptionHelper - 已经关闭。 在 org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763) 在 org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677) 在 org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:458) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:310) 在 com.sun.proxy.$Proxy27.getResultList(未知来源) 在 com.health.dao.HospitalDaoImpl.findByPostcode(HospitalDaoImpl.java:32) 在 com.health.service.HospitalServiceImpl.findHospitalByPostCode(HospitalServiceImpl.java:21) 在 com.health.travel.HospitalController.search(HospitalController.java:64) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:212) 在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) 在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 在 org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:745) 引起:org.hibernate.exception.JDBCConnectionException:无法提取ResultSet 在 org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:132) 在 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) 在 org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:89) 在 org.hibernate.loader.Loader.getResultSet(Loader.java:2065) 在 org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1862) 在 org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1838) 在 org.hibernate.loader.Loader.doQuery(Loader.java:909) 在 org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354) 在 org.hibernate.loader.Loader.doList(Loader.java:2553) 在 org.hibernate.loader.Loader.doList(Loader.java:2539) 在 org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2369) 在 org.hibernate.loader.Loader.list(Loader.java:2364) 在 org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:496) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387) 在 org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:231) 在 org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264) 在 org.hibernate.internal.QueryImpl.list(QueryImpl.java:103) 在 org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573) 在 org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:449) ... 46 更多 引起:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通讯链路故障

com.health.dao.HospitalDaoImpl.findHospitalByPostCode

/**
     * Find hospital by post code
     */
    @SuppressWarnings("unchecked")
    @Transactional
    @Override
    public List<Hospital> findByPostcode(int postcode) 
        try 
            String str = "SELECT h FROM Hospital h WHERE h.postcode BETWEEN ?1 AND ?2";
            Query query = em.createQuery(str);
            query.setParameter(1, postcode - 2);
            query.setParameter(2, postcode + 2);
            return query.getResultList();
         catch (Exception e) 
            // TODO Auto-generated catch block
            em.close();
            e.printStackTrace();
            return null;
         finally 
            em.close();
        
    

【问题讨论】:

【参考方案1】:

你在你的方法中调用了两次em.close(),但你不应该需要它们中的任何一个。由于您拥有使用 @Transactional 注释的方法,因此 Spring 框架将负责将其作为声明性事务进行管理并打开-关闭连接(如果您已正确配置)。

另请参阅:

Spring Transaction Management

【讨论】:

以上是关于JPA断开与MYSQL的连接[重复]的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 回滚事务与丢失/断开连接

存储过程将codeigniter与mysql数据库断开连接

如果 Access 与 MySQL 数据库服务器断开连接,如何刷新链接表?

如何在 ASP 经典中捕获窗口断开连接的时间戳[重复]

MySQL 服务器已消失 - 通过结帐事件处理程序的断开连接处理不起作用

Spring boot和hibernate mysql数据库连接不断断开