首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 【百分hibernate】为什么多次调用openSession();方法之后查看数据库只建立了一个连接呢 [无满意答案结帖,结帖人:wipe_tear]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-21 12:06:43 楼主
    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

      9

    发表于:2008-08-21 12:15:071楼 得分:0
    sessionFactory.openSession();
    你确认他一定会打开链接吗?你打开事务看看。
    同时你可以在循环里面做一个查询看看
    for(int i=1;i <=100;i++){
      Session session  = sessionFactory.openSession();
      session。。。。。 // 执行一个select 查询,同时打开事务,并且不提交事务。
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 13:11:232楼 得分:0
    引用 1 楼 java2000_net 的回复:
    sessionFactory.openSession();
    你确认他一定会打开链接吗?你打开事务看看。
    同时你可以在循环里面做一个查询看看
    for(int i=1;i <=100;i++){
    Session session  = sessionFactory.openSession();
    session。。。。。 // 执行一个select 查询,同时打开事务,并且不提交事务。
    }


    老紫竹: 1,他为什么不打开连接?
            2,如果没有打开连接,那么输出的为什么是false呢?
            3,我马上就按照你的思路去做,看一下,呵呵。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 13:13:303楼 得分:0
    另外老紫竹:

      在用SSH做应用的时候,中间件我选用的是tomcat,为什么它的内存越占越大呢?而且不释放,哪怕没有任何
    客户端连接,并且都关闭很长时间了,它也不自己回收哪些垃圾,进行释放,有什么办法吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • preferme
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 13:21:354楼 得分:0
    LZ有兴趣看一下,看看是不是因为,Hibernate有一个功能,就是,每个线程只会使用一个连接。
    这个功能,应该是Hibernate的SessionFactory实现的。
    通常情况下,一个线程,使用一个连接就足够用了,而且,便于调试分析。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 13:36:555楼 得分:0
    引用 4 楼 preferme 的回复:
    LZ有兴趣看一下,看看是不是因为,Hibernate有一个功能,就是,每个线程只会使用一个连接。
    这个功能,应该是Hibernate的SessionFactory实现的。
    通常情况下,一个线程,使用一个连接就足够用了,而且,便于调试分析。


    可是打印出来的确实false,那又是为什么呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 09:16:266楼 得分:0
    还有就是有内存不足,出现java.lang.outofmemoryError

    那会使在哪里出现程序问题呢,比如我现在就不停的点击
    【下一页】 现在有100页,点击到100之后在点击【第一页】
    就这么不断往复的进行,在tomcat内存占到100多M的时候就死机了,
    可是检查代码却发现没有什么问题啊,该关闭的连接都关闭了,还需要什么呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zgycsmb
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 14:10:427楼 得分:0
    学习,
    接分。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 16:49:208楼 得分: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:50:599楼 得分: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:3110楼 得分:0
    在顶一下,看看有没有高手帮助帮助妹子,嘿嘿
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-26 09:11:4211楼 得分:0
    接着顶,高手们帮忙吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-29 09:07:4912楼 得分:0
    顶,解决不了就顶上个一年,呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lvjx125
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-29 09:09:5213楼 得分:0
    引用 1 楼 java2000_net 的回复:
    sessionFactory.openSession();
    你确认他一定会打开链接吗?你打开事务看看。
    同时你可以在循环里面做一个查询看看
    for(int i=1;i <=100;i++){
    Session session  = sessionFactory.openSession();
    session。。。。。 // 执行一个select 查询,同时打开事务,并且不提交事务。
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • siriuscor
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-29 11:07:2414楼 得分:0
    引用 8 楼 wipe_tear 的回复:
    其实就是不断的调用下面的这个函数

    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.creat…


    代码我没看出什么问题,会不会是别的地方内存有泄漏,另:既然用了hibernate怎么还手动构造一个返回类,怎么不用配置文件配好pojo呢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dujun3245350
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-29 12:07:4615楼 得分:0
    学习,
    接分。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ffmusic
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-29 14:27:4416楼 得分:0
    首先明白Session 和 Connection不是一个东西。
    OpenSession使用一个Connection,不等于重新建立一个Connection

    当OpenSession后没有关闭又执行OpenSession,则会建立一个新的Connection。

    这是我的理解,大家可以去求证下。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wipe_tear
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-30 11:25:3217楼 得分:0
    现在就是不知道为什么内存不断的攀升
    修改 删除 举报 引用 回复

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