此问题很严重,什么办

解决方案 »

  1.   

    1.服务器和客户的机器是不能比的。如果一个用户不停的刷新就会造成服务器资源耗尽,那么只有两种情况:第一,服务器是100年以前的;第二,你的程序太占服务器资源了。如果第一条不成立,那么只有第二个成立。2.如果你说的客户端不停刷新的网页是一个耗时的工作,比如刷新一次就需要服务器从数据库的10M条数据中搜索一遍,这样用户不停地刷新导致服务器资源的高占用率是不可避免的,但是同时也需要注意到,即使这个用户不刷新,如果100个用户同时在使用呢?给你的建议:
    第一,使用当前正常的服务器,配置至少比PC高。
    第二,如果某个页面或者某个操作占用服务器资源,请将这个操作分开,分成n步,这样每步的资源只有1/n。
    第三,如果这个操作不能够分开的话,将此操作定位为消耗资源的操作,然后允许任何一个用户在10秒或者30秒或者一个固定的时间内只允许操作一次。
    第四,如果这个操作针对不同的人返回的结果在某个时间段内(比如说10分钟、半天等)是一样的话,请将该好资源的操作的结果缓存。
    第五,如果上述方法都没有效果,请采用最后一种方法:重新设计关于该操作的框架,无论从数据库方面实现还是从代码方面实现,唯一的目的是为了达到要求并且降低资源消耗。针对第五条,有很多方法可以实现,比如说如果是数据库操作的话,如果确实需要,可以邀请相应的数据库专家帮你优化你的sql语句,帮你重新设计你的数据库结构等。给你出一个题目,如果你能做出来了,你就能理解了。
    某金融行业的计费系统,每秒钟对数据库的插入操作是10k条,查询是20k次,每天增加的数据量大概是10亿条,你可以尝试一下如何设计这样的数据库结构以及系统架构以实现这样的功能。
      

  2.   

    非常感谢硬件服务器,价值2万以上的IBM专业服务器
    软件redhat企业版4
    数据库Postgres8.0
    应用服务器apache+tomcat+hibernate+c3p0(连接池)不单单是逻辑复杂的功能会出现此问题,就连简单的查询也会出现此问题
    并且访问量很小我在想是我的框架有问题,还是我的设计思想出问题了
      

  3.   

    难道statement或者connection忘了close()
      

  4.   

    每个connection都有关闭public static List querySQL(String sql, int limit, int offset) {// throws
    Session s = null;
    List result = null;
    Transaction t = null;
    s = HibernateUtil.currentSession();
    //log4.info("querySQL:" + sql + ",limit:" + limit + ",offset:" + offset);
     
    try {
    t = s.beginTransaction();
    Query q = s.createQuery(sql);
    if (limit > 0)
    q.setMaxResults(limit);
    if (offset > 0)
    q.setFirstResult(offset);
    result = q.list();
    t.commit();

    }
    catch (HibernateException e) {
    if (t != null)
    t.rollback();
    //e.printStackTrace();
    log4.error("querySQL HibernateException:sql="+sql+" limit:"+limit+" offset:"+offset);
    String messages = "exceptions:";
    for(int i=0; i<e.getMessages().length; i++){
    messages = messages+e.getMessages()[i]+"\n";
    }
    log4.error(messages);
    if(messages.indexOf("I/O error")>0){
    log4.info("=====reset db connect===========");
    HibernateUtil.setSessionFactory(null);
    }
    } finally {
    try{
    HibernateUtil.closeSession();
    }catch(Exception e){
    log4.info(e.getMessage());
    }
    }

    return result;
    }
      

  5.   

    与hibernate的外键关联是否也在关系
    查出一个300条的结果,至少有900条的sql语句,此表用了三个以上的外键
    好像每条记录,每个外键都有一个对应的sql
      

  6.   

    估计是hibernate没设置好我前段时间做一系统,Tomcat容器:JSP+JavaBean技术,服务器没你用的好,几个主要的表数据十万条左右,查询更新不断,有三万人在两个月内使用同时在线人数峰值在500百人,运行正常,从来没发现过刷新会很慢的中间偶尔出现死机情况,提示内存溢出,多数是在线人数很多时出现,后来找到原因:1,几个访问率很高的页面,本来不需要Session,但没有设置Session=false;
    2,数据库连接池设置过大,当时设置的好像是300,我个人认为连接池是并发访问数据库的峰值,后来改为了25;
    3,java的垃圾回工具有时候很懒,可以在适当的地方手动做一些资源回收,服务器内存紧张的时候会感觉很有效。我用的服务器1.5G内存,Mssql多数情况下会占去大半,只留100多M给Tomcat
      

  7.   

    把缓存打开,之后再加一个catch
    这样无论用户怎么刷新,产生的资源消耗也是很小的。
      

  8.   

    就个人感觉,如果是单cpu的话,有那么一两个用户拼命的按F5刷新,确实会造成服务器性能峰值。这个和服务器性能确实有关系,不过,也和用户的操作习惯有关系,我以前的系统,有些地方网络速度比较慢,他们就拼命刷新,结果,一些大的报表他们也刷新,就导致服务器卡死了。
    当时的具体解决办法就是限制了访问频率,因为按照一般的操作习惯而言,连续动作不会超过1秒或者两秒钟一次,我在Filter中限制相同的用户的访问频率不能超过1秒一次,也就是他们两次提交请求的间隔不能超过1秒。
    对于一些很占服务器性能的操作,主要是一些大型的报表的话,你可以做线程限制处理,也就是同一个服务器,最多只允许5-10个报表同时运行,当然,这个和你的服务器的cpu个数有关,也和程序有关。
    附2万元以上的 IBM服务器,确实不算是好机器,你可能还需要查看一下,就是峰值的时候,是内存耗尽,还是cpu资源耗尽,然后更新一下服务器,这样可能会比较好一些。
    个人意见,仅供参考。
      

  9.   

    好像没人说是hibernate问题,我也是在打印出hibernate日志时才发现好多sql,我再从其他方面考虑如果一直使用实体bean,查询且操作,不用会话bean会不会有关系
    我的会话bean直接续承于实体bean,相当于一层封装,进行各字段的处理
      

  10.   

    这个问题在STRUTS框架中很好的解决了,可以参照struts中的做法,引入令牌
      

  11.   

    在filter中对每个session的用户的单位时间内的访问请求数进行限制.这个是针对不需要提交信息的页面效果好.
    每个需要进行提交信息的页面设置一个令牌或者标记,在处理页检测这个标记,如果没有则继续执行,如果有则提示,然后直接结束程序.