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的连接[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如果 Access 与 MySQL 数据库服务器断开连接,如何刷新链接表?