很多人访问一个action,action访问数据库读取数据。 暂时不过多考虑框架方面,不想在数据库方面优化。最终找到2套解决方案。
1.内存缓存数据:把从数据库查询的数据存入servletContext里,做个线程定时器进行刷新servletContext,设计一个立即更新servletContext的方法。2.物理硬盘存储:动态生成html静态页面,做个线程定时器进行刷新生成静态页,设计一个立即更新生成静态页方法。这两天方案访问action 都以“计时器”间隔时间,判断是否访问数据库。通过立即更新方法保证必要数据的时时性。先说下我对这里个方案的评价。1、由于访问数据放入内存,当客户端请求的时候可做最快的提取操作。不过依然进行jsp反射显示并生成(serlvet过程不详细说明)html发送到客户端。2、生成静态页html放入硬盘,当客户端请求是要把返回目标指向html静态页位置进行返回。这是我的基本想法,我觉得直接生成静态页方案更好一些。可是有人说存入servletContext里好。只是一些简单优化方案,希望大家能一起交流下思想! 同时留下个疑问“可不可以直接把 压力过大页面直接放入缓存,每次读取直接内存返回?”

解决方案 »

  1.   

    很多人访问一个action。
    如果你说的是Struts的action,那么立足点是错误的。action是ThreadLocal。
    1. Memcache
    2. StaticContext 
    都有现成的解决方案。
      

  2.   

    必然是静态化效率最高:前端用轻量级Web服务器集群,如 EngineX 之类的,服务器上将内存虚拟为存储,然后把HTML发布目录放入内存虚拟存储区。Weblogic之类的应用中间件,处理高并发访问必然是很一般的。
      

  3.   

    首先我不是什么12306,不过我从12306认识到java在缓存方面确实没有php哪有“完美”。作为一个java程序员我比较喜欢看到别人的问题当成自己的问题来学习解决。
    同时感谢runffer_yang、ldh911的回复,我度娘了下,虽然不算太懂。现在不牵扯任何框架。
    最简陋的访问流程: 客户端发送请求到服务器,服务器拦截处理(此处我喜欢称action、当然servlet也行)做出反应。返回html到客户端。
    内存存储整个页面我觉得也是不错,喜欢物理硬盘储存的是因为可以让整个动态网站完全变成静态。全自动生成。还可以用伪静态进行物理定位。
      

  4.   

    12306我没看过……感觉确实不算简单,如果不用镜像服务器和dns缓存就单一服务器肯定顶不住几万人的压力。并发和实时确实很头疼,买票流程也不懂。感觉像我这样的菜鸟没法去做过多评论。
      

  5.   

    网站开发一般都是直接生成静态HTML
    访问时连Action都不走,直接访问HTML,里面的所有超链接都直接指向各个HTML
    连servlet都不走
      

  6.   


    可能我没说清楚我的建议方案,有几个前提先需要明确下:
    ◎ 即便是静态资源,比如js、css、gif文件,Weblogic的处理效率也要比Apache低最少1个数量级,更不要说类似于EngineX这样的轻量级服务器了;
    ◎ 缓存需要考虑的额外两个问题是:1、如何便捷的更新;2、更新时如何不造成影响。依据上面的这两个前提,我们其实可以初步有一些推论:
    ◎ 仅最大努力不要让请求落到Weblogic身上;
    ◎ 类似于Apache所提供的MemCache机制,可以将大量请求通过缓存给处理掉;此外,设置缓存过期时间可以便捷的解决内容的更新问题;
    ◎ 类似于Apache所提供的MemCache机制,在大并发量情况下,一旦MemCache过期,所有请求压力将直接落到Weblogic身上;根据这两个推论,引申出我建议的方案:
    ◎ Weblogic服务器,负责将更新的内容,作为静态资源,发布到Web服务器上;
    ◎ Web服务器(Apache、EngineX),负责所有静态资源请求的本地化处理;
    ◎ 考虑到磁盘效率访问的底下,将内存虚拟为存储,作为Web服务器的资源目录。
      

  7.   

    我是这方面的小白,首先向问下“你这样直接访问Web服务器的内存虚拟为存储”如果很多连接需要互动门户一样的静态页可能无法满足,而且很多权限在session中这样缓存没问题吗?内存缓存确实快但是访问过多对内存压力感觉很大。
      

  8.   

    楼主,需求必须首先被分类:
    ◎ 访问控制:是否需要授权才能访问?还是完全公开型的?
    ◎ 资源规模:MB?GB?TB? 或者: 数千个?数十万个?数千万个?
    ◎ 时效性:对交互时效性的需求程度:实时?分钟?小时?对于这两个问题进行谨慎分析后,你会发现很多问题会有不同的答案,最终都是组合结果,没有一招制敌的。其实CSDN就是一个非常非常好的例子:
    ◎ 访问控制:浏览可以完全公开;但发言需要授权。
    ◎ 资源规模:数千万。
    ◎ 时效性:分钟。但是你看看CSDN这些帖子的页面后缀都是什么? html
    所以静态页面未必不能满足互动要求,关键是你怎么把各功能需求进行合理切分。至于要不要采用内存虚拟为存储,完全看资源规模和访问频度的综合性价比,如果你的总体资源规模才1G,但是访问频度是每秒几千次,那用内存为啥不好?内存压力再大也比你直接去压磁盘小。而类似CSDN,我相信用的应该是Web服务器自带缓存+磁盘存储,也就是并非使用我所说的模式。
    至于集群就不在讨论范围了,这是必选项目。
      

  9.   

    对了,多个apache间如何做负载均衡?
      

  10.   

    我的意思是,比如我分别在2台服务器上安装了apache
    然后又分别在4台服务器上安装了tomcat
    是不是每个apache分别与这4个tomcat做集群
    就行了呢?
      

  11.   


    不够,你还要解决2台Apache服务器自己如何集群(或者说负载均衡)的问题。理想的情况是前面有硬件负载均衡设备,不行的话就需要借助LVS之类的软件实现机制。
      

  12.   


    如果没有硬件负载均衡设备的话
    那这2台apache服务器间的负载均衡应该如何配置呢?
    不知道有没有相关资料
    我查了很多,都是apache+N个tomcat的,这个我已经做到了
    问题是,现在又需要重新架起一个apache
    这个apache和之前的apache之间如何做,我不是很清楚
      

  13.   

    Linux的话,用LVS吧,万事开头难。采用的是虚拟IP均衡技术,也就是两台服务器对外服务的IP地址是完全一样的;对,就是你想象中的那样:IP不是冲突啦?!
    这个话题超越了Java技术论坛,可能你需要去找玩平台的论坛才能得到更专业的帮助了。
    参考资料:
    http://baike.baidu.com/view/645050.html?fromTaglisthttp://zh.linuxvirtualserver.org/
      

  14.   

    很感谢你,其实我想自己写一个 注解 然后控制action 返回自动生成html静态页存入本地,然后通过url从写来实现伪静态。这是我开这论坛的相反。所有不牵扯过多的框架和服务器技术。方便以后的编程。如何内存返回暂时没想出来。不过我记得response可以输出流。但是我这个数据流如何存在内存里?用一个静态变量还是什么?或者有什么更好的办法……
      

  15.   


    如果你非常想直接依赖于中间件能力来做的话,也是可以的。但JVM内存使用上存在限制,所以大概其需要用MemCache,直接放在JVM的HashMap里面容易OOM。可以写一个Filter,每当有请求来的时候,首先去MemCache中查找,找到了就直接向response输出即可(也别重定向了)。找不到就不管了。Servlet处理完毕后,需要先将结果写入MemCache,这样下次就可以直接使用。
    最后补充上缓存过期时限即可。
      

  16.   

    哦,我用内存输出了还算理想,就是编码头疼了……。过滤器肯定和java一些web服务器(tomcat、weblog、websphere等)有一些关联所一次性吃不消……所有智能在从程序方面解决。外层过来映射资源确实是个好想法。