2012-01-17 5 views
3

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

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) 

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

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

ответ

12

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

  1. Вы можете выпустить какой-то тип запроса «сохранить живого» (например: SELECT 1) в соединении так часто, чтобы сохранить его в живых. Это предполагает, что он закрыт, потому что он простаивает.
  2. Вы можете повторно открывать соединение так часто.
  3. Если вы получаете закрытое исключение соединения, вы можете просто повторно открыть соединение. Duh.
  4. Вы можете использовать пул соединений, который может выполнять сохранение и повторное подключение для вас. Apache's 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(), когда вы сделали с ним. Пул выполняет всю работу по валидации и т. Д. Он также позволит нескольким потокам использовать базу данных.

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


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

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

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

+1

Спасибо, но я попытался запустить живой поток и выполнить запрос, но он не работает. Я должен каждый раз закрывать сессию спящего режима. Только так работает. –

+2

Ох. Я не понимал, что вы все время проводили сеанс гибернации. Это очень плохая форма. Вы должны закрыть это после того, как ваша база данных будет передана, иначе она будет привязана к определенному соединению навсегда. – Gray

+1

Я отредактировал свой ответ, чтобы принять во внимание сессию. – Gray

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