org.hibernate.exception.GenericJDBCException: не удалось выполнить запрос - PullRequest
4 голосов
/ 17 января 2012

Я использую hibernate 3.6.7 для создания карт. Я установил часть соединения как статическую. Мне нужно, чтобы сервисная программа работала вечно, а другой сервис будет вызывать некоторые методы этого сервиса для запроса базы данных. Когда я оставляю службу запущенной, в первый день она работает хорошо, но когда я звоню ей на следующий день, она дает:

org.hibernate.exception.GenericJDBCException: could not execute query
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.loader.Loader.doList(Loader.java:2545)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
    at org.hibernate.loader.Loader.list(Loader.java:2271)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:459)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:365)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
    at com.myCompany.Query.myMethod(Query.java:99)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185)
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.ebayopensource.ginger.server.internal.container.MessageProcessor.processRequest(MessageProcessor.java:93)
    at org.ebayopensource.ginger.server.container.GingerServletShell.service(GingerServletShell.java:80)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:568)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.sql.SQLException: Closed Connection
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
    at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:864)
    at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:783)
    at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534)
    at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:452)
    at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1700)
    at org.hibernate.loader.Loader.doQuery(Loader.java:801)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
    at org.hibernate.loader.Loader.doList(Loader.java:2542)

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

Большое спасибо:)

Ответы [ 2 ]

12 голосов
/ 18 января 2012

Похоже, либо база данных закрыла соединение, либо какое-то сетевое устройство завершило сокет.Существует много способов обойти эту проблему:

  1. Вы можете периодически запускать какие-либо запросы типа «поддерживать активность» (например, SELECT 1) для соединения, чтобы поддерживать его.Это предполагает, что оно было закрыто, потому что оно бездействовало.
  2. Вы можете открывать соединение время от времени.
  3. Если вы получаете исключение закрытое соединение, то вы можете просто снова открыть соединение.Дух.
  4. Вы можете использовать пул соединений, который может поддерживать и восстанавливать соединения. Apache DBCP является фаворитом многих.

Я рекомендую последний.Вы бы использовали DBCP что-то вроде:

BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
ds.setUsername("scott");
ds.setPassword("tiger");
ds.setValidationQuery("SELECT 1"); // this is database specific
ds.setTestWhileIdle(true); // test the connections every so often
ds.setUrl(connectURI);
...
while (!shutdown) {
    Connection conn = dataSource.getConnection();
    Statement stmt = conn.createStatement();
    ...
    stmt.close();
    // this returns the connection back to the pool instead of really closing
    // the connection
    conn.close();
}

Поэтому вместо передачи Connection вы передаете BasicDataSource и вызываете getConnection(), когда вам нужно соединение и conn.close() когда вы закончите с этим.Пул выполняет всю работу по проверке и т. Д. Он также позволит нескольким потокам использовать базу данных.

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


Редактировать: Вытакже не может удерживать спящий режим открытым в течение длительного времени.Чтобы показать вам, насколько коротким должен быть сеанс, я процитирую из документов:

Жизненный цикл сеанса ограничен началом и концом логической транзакции.(Длинные транзакции могут охватывать несколько транзакций базы данных.)

Сеанс содержит соединение с базой данных, поэтому вы никогда не захотите сохранять его в течение какого-либо промежутка времени.Вы должны выполнить пару запросов к базе данных (например, один веб-запрос с запросами и обновлениями), а затем закрыть сеанс, чтобы базовое соединение с базой данных могло быть возвращено в пул.

1 голос
/ 30 марта 2019

Что, возможно, структура модели JAVA изменена, но обновление таблицы БД неверно!Что делают Модель и таблица БД не полностью соответствуют.Вы можете сделать так:

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