mewuhua
mewuhua
2009-10-09 11:52

Hibernate在中的 session 管理问题

已采纳

我用Hibernate生成的HibernateSessionFactory 获得session 写了一个得到数据库数据的方法 用的是Hibernate的
query 结果连接各两三次就包错了 看看是不是写错了

public List getByAll(String hql) {
    Session session = HibernateSessionFactory.getSession();
    List list = new ArrayList();
    Query query = session.createQuery(hql);
    Transaction tx = session.beginTransaction();
    try{
    list = query.list();
    tx.commit();

    }catch(Exception e){
        e.printStackTrace();

    }finally{

    }

    return list;
}

[b]问题补充:[/b]
我把一场贴出来 报的是Query接口的错误 在List list = query.list()那错了

org.hibernate.exception.JDBCConnectionException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.doList(Loader.java:2148)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at SessionDao.getAllDate(SessionDao.java:14)
at logon.doPost(logon.java:40)
at logon.doGet(logon.java:25)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
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:228)
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:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Unknown Source)
Caused by: com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:

** BEGIN NESTED EXCEPTION **

java.net.SocketException
MESSAGE: Software caused connection abort: recv failed

STACKTRACE:

java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:75)
at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:94)
at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:122)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1842)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2292)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2788)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1534)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1625)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2297)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2226)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1812)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1657)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)
at org.hibernate.loader.Loader.doQuery(Loader.java:662)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2145)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at SessionDao.getAllDate(SessionDao.java:14)
at logon.doPost(logon.java:40)
at logon.doGet(logon.java:25)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
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:228)
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:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Unknown Source)

** END NESTED EXCEPTION **

at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2504)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2788)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1534)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1625)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2297)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2226)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1812)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1657)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)
at org.hibernate.loader.Loader.doQuery(Loader.java:662)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2145)
... 24 more

[b]问题补充:[/b]
后来我关闭了session。 可是用着用着还是报错了 我用了 懒加载的
是不是数据量大了 session出错了 数据库是mysql 小弟急死了
[b]问题补充:[/b]
这个是 Hibernate的执行语句
Hibernate: select vmark0_.id as id6_, vmark0_.fk_zone_id as fk2_6_, vmark0_.mark_name as mark3_6_, vmark0_.mark_address as mark4_6_, vmark0_.mark_content as mark5_6_, vmark0_.mark_status as mark6_6_, vmark0_.mark_type as mark7_6_ from numdum.v_mark vmark0_

这个是我写的hql语句
from VMark

这个是VMark的映射文件






































[b]问题补充:[/b]
把改进后的Dao也贴出来

这是操作数据库方法

public List getAllDate(String hql){
    List list = new ArrayList();
    try{
    Session session = HibernateSessionFactory.getSession();
    Query query = session.createQuery(hql);
    list = query.list();
    HibernateSessionFactory.closeSession();
    }catch(Exception e){
        e.printStackTrace();
    }finally{

    }
    return list;
}

[b]问题补充:[/b]
手动关闭,用session.close()关闭后 报 session is ready close 的错
郁闷
[b]问题补充:[/b]
我改了 没用事物了

session.isConnected()是true

true
Hibernate: select vproducts0_.id as id14_, vproducts0_.fk_protype_id as fk2_14_, vproducts0_.fk_brand_id as fk3_14_, vproducts0_.fk_shop_id as fk4_14_, vproducts0_.pro_name as pro5_14_, vproducts0_.pro_picture as pro6_14_, vproducts0_.pro_inventory as pro7_14_, vproducts0_.pro_total as pro8_14_, vproducts0_.pro_retail as pro9_14_, vproducts0_.pro_wholesale as pro10_14_, vproducts0_.pro_retail_number as pro11_14_, vproducts0_.pro_wholesale_number as pro12_14_, vproducts0_.pro_date as pro13_14_, vproducts0_.pro_status as pro14_14_, vproducts0_.pro_content as pro15_14_, vproducts0_.pro_color as pro16_14_, vproducts0_.pro_if as pro17_14_, vproducts0_.pro_lockup as pro18_14_, vproducts0_.pro_hit as pro19_14_, vproducts0_.pro_if_sale as pro20_14_, vproducts0_.pro_if_inshop as pro21_14_, vproducts0_.pro_sale_date as pro22_14_ from numdum.v_products vproducts0_
org.hibernate.exception.JDBCConnectionException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.doList(Loader.java:2148)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at SessionDao.getAllDate(SessionDao.java:17)
at logon.doPost(logon.java:36)
at logon.doGet(logon.java:25)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
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:228)
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:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Unknown Source)
Caused by: com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:

** BEGIN NESTED EXCEPTION **

java.io.EOFException

STACKTRACE:

java.io.EOFException
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1845)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2292)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2788)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1534)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1625)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2297)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2226)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1812)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1657)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)
at org.hibernate.loader.Loader.doQuery(Loader.java:662)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2145)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at SessionDao.getAllDate(SessionDao.java:17)
at logon.doPost(logon.java:36)
at logon.doGet(logon.java:25)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
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:228)
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:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Unknown Source)

** END NESTED EXCEPTION **

at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2504)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2788)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1534)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1625)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2297)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2226)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1812)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1657)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)
at org.hibernate.loader.Loader.doQuery(Loader.java:662)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2145)
... 24 more

[b]问题补充:[/b]
弱弱的问一句
会不会是因为session中管理的数据多了 或着是数据库的问题

我用的是懒加载

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

14条回答

  • CaiHuajiang CaiHuajiang 12年前

    应该不会是懒加载的问题,这种问题通常出现在集合身上。

    我认为还是语句执行时的问题。
    1.session已失效,最好通过一些方式确认一下,其还能否连上数据库。
    2.HQL本身有问题,将生成的SQL语句拿到mySQL中跑一下。
    [quote]org.hibernate.exception.JDBCConnectionException: could not execute query
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) [/quote]
    3.映射不规范。

    能想到的就这些了。

    点赞 评论 复制链接分享
  • CaiHuajiang CaiHuajiang 12年前

    [quote]Session session = HibernateSessionFactory.getSession();[/quote]

    反正很无语了,将内容改为
    [code="java"]Session session = HibernateSessionFactory.getSessionFactory().openSession();[/code]

    点赞 评论 复制链接分享
  • dream11867 dream11867 12年前

    查询不用事务提交,楼主的代码略显不规范,请阅读相关的源码。

    点赞 评论 复制链接分享
  • CaiHuajiang CaiHuajiang 12年前

    问题应该是出在这句
    [code="java"]Session session = HibernateSessionFactory.getSession(); [/code]
    这里拿到的连接不是合法的连接,该连接应该已失效。
    测试下,在该句后面输出
    [code="java"]System.out.println(session.isConnected());[/code]
    如果连接失效的话,此处该输出false;

    点赞 评论 复制链接分享
  • easinchu easinchu 12年前

    [quote]问题补充:
    把改进后的Dao也贴出来

    这是操作数据库方法

    public List getAllDate(String hql){
    List list = new ArrayList();
    try{
    Session session = HibernateSessionFactory.getSession();
    Query query = session.createQuery(hql);
    list = query.list();
    HibernateSessionFactory.closeSession();
    }catch(Exception e){
    e.printStackTrace();
    }finally{

    }
    return list;
    } [/quote]
    你这段代码是修改后的?你这里手动关闭了session?

    点赞 评论 复制链接分享
  • CaiHuajiang CaiHuajiang 12年前

    请把传递给方法的hql语句和数据库映射字段帖出来吧。

    点赞 评论 复制链接分享
  • lianj lianj 12年前

    LZ别让大家猜得难受啊,你贴出错误的类型阿! 异常贴出来!

    点赞 评论 复制链接分享
  • wshwrf wshwrf 12年前

    public List getByAll(String hql) {
    Session session = HibernateSessionFactory.getSession();
    List list = new ArrayList();
    Query query = session.createQuery(hql);
    Transaction tx = session.beginTransaction();
    try{
    list = query.list();
    tx.commit();

    }catch(Exception e){
    e.printStackTrace();
    }finally{
    这里要关闭session.close();事务的提交,session只是刷新了并没有关闭.
    }
    return list;
    }

    点赞 评论 复制链接分享
  • easinchu easinchu 12年前

    如果你的项目中没有其他帮助管理Hibernate的Session的组件(例如:Spring)的话,请你在finally中手动关闭session;
    建议你不要在查询方法中使用显式的事务配置,影响性能,代码难看,建议事务还是通过声明的方式叫给容器管理。

    点赞 评论 复制链接分享
  • weixin_42317583 weixin_42317583 12年前

    session关闭

    点赞 评论 复制链接分享
  • CaiHuajiang CaiHuajiang 12年前

    楼上代码虽然不规范,不过不应该会出错。
    如果没错的话,错误应该是在外面调用方法后对返回结果list进行处理时抛的错。

    点赞 评论 复制链接分享
  • sbli27 sbli27 12年前

    建议生成一个session就马上close掉

    点赞 评论 复制链接分享
  • mycell_13651784029 mycell_13651784029 12年前

    How about following implementation :

    [color=blue]public List getByAll(String hql) {
    try{
    Session session = HibernateSessionFactory.getSession();

     Query query = session.createQuery(hql);
    
     return query.list();
    

    }catch(Exception e){
    //TODO
    }

    }[/color]

    点赞 评论 复制链接分享
  • iteye_18964 iteye_18964 12年前

    查询不需要事务

    点赞 评论 复制链接分享

相关推荐