org.hibernate.exception.GenericJDBCException:无法执行查询

时间:2012-01-17 19:06:41

标签: java hibernate exception

我正在使用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 个答案:

答案 0 :(得分:12)

听起来数据库已关闭连接或某些网络设备已终止套接字。有很多方法可以解决这个问题:

  1. 您可以经常在连接上发出某种“保持活跃”类型的查询(例如:SELECT 1)以使其保持活动状态。这假设它因为闲置而关闭。
  2. 您可以经常重新打开连接。
  3. 如果您收到连接已关闭的异常,则可以重新打开连接。咄。
  4. 您可以使用连接池,它可以为您保持活动和重新连接。 Apache's DBCP是许多人的最爱。
  5. 我推荐最后一个。您可以使用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}}该池完成所有验证工作等。它还允许多个线程使用数据库。

    希望这有帮助。


    修改:您也无法长时间暂停hibernate session。为了向您展示会话应该有多短暂,我将引用文档:

      

    会话的生命周期受逻辑事务的开始和结束的限制。 (长事务可能跨越多个数据库事务。)

    会话保存数据库连接,因此您永远不想在任何时间内保留它。您应该执行几个数据库请求(例如带有查询和更新的单个Web请求),然后关闭会话,以便可以将基础数据库连接返回到池中。

答案 1 :(得分:0)

也许JAVA模型的结构已更改,但是数据库表更新不正确!是什么使Model与DB表不完全对应。 您可以这样:

  • 放下旧桌子
  • 重新启动项目以重建表