首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 【百分hibernate】为什么多次调用openSession();方法之后查看数据库只建立了一个连接呢 [无满意答案结贴,结贴人:wipe_tear]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-21 12:06:09 楼主
                    Session session  = sessionFactory.openSession();
    Session session1 = sessionFactory.openSession();
    Session session2 = sessionFactory.openSession();
    Session session3 = sessionFactory.openSession();
    Session session4 = sessionFactory.openSession();
    Session session5 = sessionFactory.openSession();
    Session session6 = sessionFactory.openSession();
    代码如上所示,用的是jndi的连接池,是和spring一起用的,连接的是oracle,
    但是在后台我却发现建立的不是6个连接,而仅仅只有一个,最大活跃数设为30了,肯定没有问题,不知道为什么
    sessionFactory是由spring建立的并管理的,但是openSession();应该会建立多个连接啊,为什么会是这样呢?
    并且System.out.println(session==session1);打印出来的还是false,可是oracle中显示的却真的只有一个连接
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • java2000_net
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      2

      8

    发表于:2008-08-21 12:15:311楼 得分:0
    发2个噢!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 13:13:212楼 得分:0
    引用 1 楼 java2000_net 的回复:
    发2个噢!


    呵呵,为了更好的解决我的疑惑呗,另外
    老紫竹:

      在用SSH做应用的时候,中间件我选用的是tomcat,为什么它的内存越占越大呢?而且不释放,哪怕没有任何
    客户端连接,并且都关闭很长时间了,它也不自己回收哪些垃圾,进行释放,有什么办法吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fosjos
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 13:31:053楼 得分:0
    会话和连接是不同的概念

    jvm的回收机制问题
    一般想要回收都会加object=null;和system.gc();
    但效果不明显,只有分配给tomcat的内存不够时,才会释放
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 13:41:164楼 得分:0
    引用 3 楼 fosjos 的回复:
    会话和连接是不同的概念

    jvm的回收机制问题
    一般想要回收都会加object=null;和system.gc();
    但效果不明显,只有分配给tomcat的内存不够时,才会释放


    不知道你遇见过这种问题没有,就是当分配的内存不足够的时候它不但不会释放内存,
    反而直接就死机那了,然后爆出java.lang.outmemorryException哦
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Saro
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 14:05:125楼 得分:0
    一个tomcat实例只能管理1g的内存。

    出现OutOfMemoryException一般都是程序问题。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 14:54:536楼 得分:0
    引用 5 楼 Saro 的回复:
    一个tomcat实例只能管理1g的内存。

    出现OutOfMemoryException一般都是程序问题。


    那会使在哪里出现程序问题呢,比如我现在就不停的点击
    【下一页】 现在有100页,点击到100之后在点击【第一页】
    就这么不断往复的进行,在tomcat内存占到100多M的时候就死机了,
    可是检查代码却发现没有什么问题啊,该关闭的连接都关闭了,还需要什么呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ansjsun
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 22:17:377楼 得分:0
    SessionFactory是一个实例.是静态随服务器启动加载的.
    他的openSession是static是静态的.全局代码区中的.所以就是一个了.
    我记得Hibernate有个数据源的.你看看你的数据源是怎么配置的.就在hibernate的配置文件中.
    当然也可以在web.xml中配置数据源.你都看看吧/./.死机是为啥我就不知道啦...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dragon2k
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 23:54:588楼 得分:0
    楼主,典型内存泄露啊,随便拿个工具分析一下dump文件,看看有哪些数据对象没有释放,
    我估计可能是查询出的结果没释放的原因
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 09:15:269楼 得分:0
    引用 8 楼 dragon2k 的回复:
    楼主,典型内存泄露啊,随便拿个工具分析一下dump文件,看看有哪些数据对象没有释放,
    我估计可能是查询出的结果没释放的原因


    查询出来的结果如何释放啊,我都是用hibernate的Query的方法做查询,
    然后返回一个List,然后把这个List放入到request当中,之后在展示页面
    用struts标签进行展示,也没有办法进行销毁工作啊,怎么办呢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • suncf1985
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 10:22:5010楼 得分:0
    单态模式
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zou_wei_forever
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 10:47:1011楼 得分:0
    可能这样:在openSession()方法中,如果session==null就创建一个新的session,否则就返回当前的session。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dragon2k
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 11:43:5612楼 得分:0
    引用 9 楼 wipe_tear 的回复:
    引用 8 楼 dragon2k 的回复:
    楼主,典型内存泄露啊,随便拿个工具分析一下dump文件,看看有哪些数据对象没有释放,
    我估计可能是查询出的结果没释放的原因


    查询出来的结果如何释放啊,我都是用hibernate的Query的方法做查询,
    然后返回一个List,然后把这个List放入到request当中,之后在展示页面
    用struts标签进行展示,也没有办法进行销毁工作啊,怎么办呢


    上面有个兄弟说执行 obj=null;system.gc();请大家不要认为这样就会释放这个obj,
    具体什么时候释放还要等jvm决定,你连续点就outOfMemory的可能原因:
    1.并发导致,
    极端情况相当于100人同时请求这个查询,那系统就爆炸啦,看看是不是List一次查询
    返回的条数过多,可不可以优化,例如使用分页的方式。
    2.资源在其他地方引用没有释放
    当系统dump以后,看dump日志,分析到底是什么东西导致了内存没有被释放,也可能与
    hibernate无关,比如使用了smartUpload等其他的东东。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 16:44:1713楼 得分:0
    引用 12 楼 dragon2k 的回复:
    引用 9 楼 wipe_tear 的回复:
    引用 8 楼 dragon2k 的回复:
    楼主,典型内存泄露啊,随便拿个工具分析一下dump文件,看看有哪些数据对象没有释放,
    我估计可能是查询出的结果没释放的原因


    查询出来的结果如何释放啊,我都是用hibernate的Query的方法做查询,
    然后返回一个List,然后把这个List放入到request当中,之后在展示页面
    用struts标签进行展示,也没有办法进行销毁工作啊,怎么办呢


    上面有个兄弟说执行 obj…



    怎么用dump这东西啊,大家在做ssh结合的时候都没有遇见过这样的问题吗
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 16:49:1214楼 得分:0
    其实就是不断的调用下面的这个函数

    public List topResult(int len1, int len2,String daqucode) {
    // TODO Auto-generated method stub
    Session session = sessionFactory.openSession();
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    Calendar mouth = Calendar.getInstance();
    Date a=mouth.getTime();
    String now = formatter.format(a); //将日期时间格式化

    Query query = session.createSQLQuery(" select zhongduan.code,zhongduan.name,zhongduan.tel,zhongduan.address,zhongduan.status,zhongduan.faren,zhongduan.yuerongliang,zhongduan.yuehetongliang,zhongduan.yuejihualiang,zhongduan.hezuoxingzhi,zhongduan.yedai,zhongduan.zhongduanleibie,zhongduan.quyuzhuguan,zhongduan.qita1,zhongduan.qita2,zhongduan.qita3,zhongduan.codeBelong from zhongduan,songhuodanyuan,jingxiaoshang,xiaoquyu,banshichu where zhongduan.codeBelong=songhuodanyuan.code and songhuodanyuan.codeBelong=jingxiaoshang.code and jingxiaoshang.codeBelong=xiaoquyu.code and xiaoquyu.codeBelong=banshichu.code and banshichu.codeBelong='"+daqucode+"' and zhongduan.iyear=year('"+now+"') and zhongduan.imonth=month('"+now+"') order by zhongduan.id desc ");
    query.setFirstResult(len1);
    query.setMaxResults(len2);
    Iterator it = query.list().iterator();
    List list1 = new ArrayList();
    List list2 = null;
    RecordZhongduan record = null;
    while (it.hasNext()) {
    record = new RecordZhongduan();
    Object[] rowlist = (Object[]) it.next();
    record.setCode(rowlist[0].toString());
    record.setName(rowlist[1].toString());
    record.setTel(rowlist[2].toString());
    record.setAddress(rowlist[3].toString());
    record.setStatus(rowlist[4].toString());
    record.setFaren(rowlist[5].toString());
    record.setYuerongliang(rowlist[6].toString());
    record.setYuehetongliang(rowlist[7].toString());
    record.setYuejihualiang(rowlist[8].toString());
    record.setHezuoxingzhi(rowlist[9].toString());
    record.setYedai(rowlist[10].toString());
    record.setZhongduanleibie(rowlist[11].toString());
    record.setQuyuzhuguan(rowlist[12].toString());
    record.setQita1(rowlist[13].toString());
    record.setQita2(rowlist[14].toString());
    record.setQita3(rowlist[15].toString());
    record.setCodeBelong(rowlist[16].toString());


    // 通过code查询终端的数量,注意: SQL queries do not currently support iteration
    //String hsql = "select count(*) from v_chaxun where jingxiaoshangcode=:jingxiaoshangcode";
    //query = session.createSQLQuery(hsql);
    //query.setString("jingxiaoshangcode", rowlist[0].toString());
    //int count = ((Integer) query.list().get(0)).intValue();

    // int count=((Integer)query.iterate().next()).intValue();
    //record.setCount(count);

    // 取得月合同量、月计划量、月容量

    // 下面要添加两个操作:操作1和操作2
    record.setOper1(rowlist[0].toString());
    record.setOper2(rowlist[0].toString());
    list1.add(record);
    }
    session.close();
    return list1;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 16:51:1215楼 得分:0
    sessionFactory是由spring注入的

            private SessionFactory sessionFactory;

    public SessionFactory getSessionFactory() {
    return sessionFactory;
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 11:37:3416楼 得分:0
    在顶一下,看看有没有高手帮助帮助妹子,嘿嘿
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhangzong
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 14:14:2717楼 得分:0
    觉得上面的程序有点问题.....每次连接用完之后没有关闭...而且结果集的操作也不是很好...等JVM帮你回收..你可以人为的回收..这样就会省很多资源..
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-26 09:11:2518楼 得分:0
    引用 17 楼 zhangzong 的回复:
    觉得上面的程序有点问题.....每次连接用完之后没有关闭...而且结果集的操作也不是很好...等JVM帮你回收..你可以人为的回收..这样就会省很多资源..


    1,每次连接我都关闭了,有session.close();
    2, 我如何认为回收啊,我要返回一个List,然后页面用struts标签进行展示呢。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-29 09:07:5319楼 得分:0
    顶,解决不了就顶上个一年,呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Java_Factory
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-29 12:18:1520楼 得分:0
    个人感觉!你的sessionFactory!你开始说只返回一个!那就是对的!因为那个sessionFactory是全局static的!其他多用户调用那也只是线程中的问题。/sessionFactory是单线程的绑定,而多用户处理时候jvm考虑的是线程的随机性。
    你的代码我在看看。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cuilupeng999
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-29 13:03:2421楼 得分:0
    本身注入sessionFactory是一个实例
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chenggm
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-29 15:31:2922楼 得分:0
    spring中注入的sessionFactory定义了singleton="true",
    要是程序出现异常,session有可能不会关闭
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-30 11:26:4023楼 得分:0
    关键的问题是不知道为什么内存不断的攀升,真崩溃
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Java_Factory
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-01 09:29:0824楼 得分:0
    这个问题还没解决啊??
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Java_Factory
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-01 09:31:1225楼 得分:0
    我想到过方法可以帮你觉得出现多个session:你在HibernateSessionFactory中在创建一个方法:
    public static Session getAnotherSession() throws HibernateException{
            if (sessionFactory == null) {
                rebuildSessionFactory();
            }
            return sessionFactory.openSession();

            }
    调用多次!这样子也许可以避免出现你上面的问题!
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved