做JAVA开发5年了,一直从事的应用系统开发,基本上用SSH做应用系统的主要开发架构,做系统到是轻车熟路,游刃有余。但就最近做了一个网站,“大姑娘上轿头一回”,不知道采用什么方式去做(主要是前台页面数据显示的问题),而且网站也很简单,只需要做页面,然后把数据显示出来就行,因为要和应用系统嵌在一起,所以后台的开发都不存在什么问题,几天光景就给全部完成,关于前台数据显示我想Action去做,肯定不行,操作起来不是很方便,也不合理,后来我就采用JQuery+AJAX做的,网站到是做完了,自己测试一切OK,但是后来投入试运行,问题来了,人访问的多了,页面就一直处于打开等待状态,最后数据不显示,后来我在本机测试,我不停的刷新和打开页面,到一定次数,也出现同样地情况,出现这种情况我只有把我的tomcat重新启动,然后页面显示才正常。
    例如我的首页(default.jsp)
    要查询首页栏目(数据表:WWW_FANCE),系统公告(数据表:WWW_AFFICHE),文章(数据表:WWW_ARTICLE)....等等,总之这个首页查询的数据特别的多,如下:
<script type="text/javascript">
var dep = "40288a3925da98f90125daa35aa6000e";
$(document).ready(function(){
queryAffiche(dep);
disSysTime();
queryNewSlidesPic(dep, 4, "n");
queryWorkTask(dep, 8);
queryArticle("40288a3c3146af43013146e51b64000c", 10, "news ul", 19);
queryArticle("40288a3c3146af43013146e57aca000d", 10, "f2-1 ul", 19);
queryArticle("40288a3c326c3f9001326c7fe0e20006", 10, "f2-2 ul", 26);
queryArticle("40288a3c334868de01334ab1ec6a000e", 10, "f2-3 ul", 19);
querySafetyDays(dep);
queryMetting(dep, '0');
setLeftPosition();
queryLatestPhotoAlbum(dep, 6);
queryNavFance(dep);
queryPersonInfo();
});
</script>我不知道是不是我这样一种方式去做是不是不可行的,,或者我出现这样的情况到底是什么原因引起的,希望JAVA搞网站开发的老大们指点一下,后来请教了一个朋友,说用DWR去做,,我现在的思路不是特别清楚,希望能指点指点,谢谢。

解决方案 »

  1.   

    tomcat 是一个内存连接什么的。你报错的信息有吗?
    应该在你tomcat的log里头会看到报错的,我记得。
      

  2.   

    谁告诉你首页不能action跳过去?你一个首页请求那么多,早晚垮。
    网站访问量大,框架越简单越好,你非用最笨重的ssh。
    一个页面上十几个查询,再加上用户身份什么的,一个人开二十几个数据库会话,游标估计都快到上限了=================
    首页没可能全部显示吧?都是前多少条然后给个“更多”链接吧?
    数据库,把所有首页需要的数据变成物化视图。后台,首页需要的所有查询写到一个方法里,防止每个调用都产生一个action代理,如果你struct2玩明白了就不用管这条。前台,只有“用户读取之后做出动作才发生变化的”用ajax,其它的老老实实走跳转。服务器,找个明白tomcat的人好好设置下参数。
      

  3.   

    不是我用最笨重的SSH,,因为我的网站是扩展,,本来已经有个应用系统在运行了,难道我还重新用个架构去开发个网站,前面我还想用PHP,后来想也不可行, 系统搭建一个环境,PHP又搭建一个环境,客户又不干。。
      

  4.   


    我查看我的log日志,没有异常日志。
      

  5.   


    我的就是写一个action,然后用ajax调用。
      

  6.   

    我们公司做的系统也出现了这个问题,最近刚刚发现。听他们说调tomcat,具体怎么我也不会,抱歉啊!
      

  7.   

    我们的项目也是应用系统和web访问共存的。挑选合适的前台显示方式。你去看看velocity。
      

  8.   

    打开页面等待状态,我碰到的情况就是服务器的线程满了,没有空闲的线程分配给其他用户,造成等待。
    解决办法增加服务器的线程数,当然线程数是和服务器的CPU数量有关系不能随便加(我的是4个CPU,线程数定为120),同时300多人访问并操作还是够用。
      

  9.   


    要是这样,那我这个方案是不可行了,,因为服务器这个东西固定了,不可能换。。而且还是以前的老式IBM的立式服务器。。
      

  10.   

    5年JAVA应用系统开发,想做一个网站,居然不会
    ==============================================
    你以为你会做系统开发,直接就能上手做网站啊,现在的网站程序比你们的所谓系统开发复杂多了
      

  11.   

    要查询首页栏目(数据表:WWW_FANCE),系统公告(数据表:WWW_AFFICHE),文章(数据表:WWW_ARTICLE)....等等,总之这个首页查询的数据特别的多,如下
    首页数据必须缓存起来,后台数据没修改时候才去刷新缓存。
      

  12.   

    网站分很多种,有资讯类网站,有实时信息类网站,有交互类网站。
    资讯类需要静态化,cdn加速。 实时信息类网站需要查询数据库,要求信息及时可靠,如证券信息,这个需要用到一些推技术后者socket技术实现。交互类网站(大型社区)这个架构最复杂。主从数据库,数据缓存,分流。
    根据楼主的问题,可以获取的信息不是很多,初步估计是请求有阻塞。具体问题具体分析看是http阻塞还是数据库阻塞。
      

  13.   

    网站跟企业级应用肯定不一样了,网站的特点是访问用户多,而访问用户多,常规架构的企业应用就顶不住了。考虑一些页面用静态化技术,系统架构方面考虑加一台或多台(用做负载均衡,分散访问量)Web服务器,避免频繁访问数据库如用缓存技术,还可以用gzip压缩。多试试,会有好转的。
      

  14.   


    数据源配置文件:
    <bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName">
    <value>oracle.jdbc.driver.OracleDriver</value>
    </property>
    <property name="url">
    <value>jdbc:oracle:thin:@127.0.0.1:1521:XE</value>
    </property>
    <property name="username">
    <value>spms</value>
    </property>
    <property name="password">
    <value>spms</value>
    </property>
    </bean>
      

  15.   

    碰到过类似的问题,我们这是数据库连接问题,连接占满了,不过我们用的是mysql数据库,还有一次是数据库有死锁了,楼主可以试试先不连接数据库进行刷新,看是不tomcat的事,有时tomcat线程不够用了也会出现等待
      

  16.   

    我觉得,一方面首页除了在进行用户访问需要的时候才用jquery来做异步,其他时候不要那样。同时,同一个页面的查询使用一个数据库连接,连接资源相当宝贵,不要查一个表建一个连接,一方面数据库连接太多可能拒绝,另一方面等待时间长.第二个加上缓存系统,减少连接,比如连接池,使用上肯定比用纯JDBC好,而且你不是用了Hibernate么,把它的缓存好好利用.注意不要太多的jquery异步ajax,没实际作用的只会带来麻烦...也许说得不对,看哪个对你有作用吧!
      

  17.   


    我也乱讲几句首先要确保的有:
    1.数据库连接一定要释放,当你访问人多了卡住时,去检查一下oracle的连接是不是没有释放.
        查询所有会话
          select sid,logon_time,username,machine from v$session; 
        按用户/主机统计
          select username,machine,count(*) from v$session group by username,machine;
       
        我觉得,应该是刷新多少次,就有多少个请求,服务器程序是不知道的,连接是被客户端抛弃的,只有服务器向客户端扔数据时才会发再,但服务器肯定已经准备了数据.所以应该执行的都执行了.2.做网站主要是发布信息,25楼说得有道理,像首页这种访问量大,更新频率高的页面,最好做在内存里,用一套机制实现更新到磁盘(数据库)时,同时更新到内存.
       我觉得,html是最好的方式.3.最重要的,楼主应该找到底慢在哪里, 是数据库,还是tomcat(容器),或者是网络,或者是客户端的解析.
      楼主还可以跟踪内存变化来确定原因,比如你把数据库,应用,客户端都分开来部署(不同的物理机器),监测内存.4.用那个dwr的话,也不见得能解决问题,我用过别人一个dwr的应用系统,也不见得好快.5.实在不行,servlet吧,也挺好的.
      

  18.   

    对,这个刚忘了说,连接的释放问题,自己做jdbc是要手动释放,做连接池的时候就是放回嘛,Hibernate相应
      

  19.   

    在catalina.bat里设置初始内存和最大内存: 
    set CATALINA_OPTS="-Xms30m -Xmx512m" 
    检查一下在每Catalina.bat文件,个“%_RUNJAVA%”后面都应该有“%CATALINA_OPTS%” 
    有的Catalina.bat文件在“%_RUNJAVA%”后面跟着“%JAVA_OPTS%”, 
    如果是这样,应该设置: 
    set JAVA_OPTS=-Xms30m -Xmx512m 
    或者在每个“%_RUNJAVA%”后面加上“%CATALINA_OPTS%” 
      

  20.   

    tomcat不熟悉,weblogic10有监视线程情况的页面(console控制台),可以查看当前空闲线程多少,当前访问网站的用户有多少。我一般都是根据这些情况调配线程。还有你要查看你服务器当前的线程数量是多少,默认的一般不会很大也就15左右。
      

  21.   

    现在做网站的基本上都用PHP或者.net做网站,还有的就是全站是flash,用java做网站的比较少,而且调整BUG也比较繁琐,好像是有一些做网站的框架一套网站就出来了。。
      

  22.   

    你做了5年开发 一直忽视 性能方面的问题 说真的 这5年 你等于干了2年的水平。你可以从 分布式开发 如EJB3的技术 集群 页面静态化 页面模版出发
      

  23.   

    啥米网站啊,用个开源的CMS建个好了!
      

  24.   

    ssh 的时候 hibernate的sessionfactory 自动管理事务的。
    我最近也做了个ssh的网站 不过没有遇到这样的问题~
      

  25.   

    人访问多了,不知道是不是tomcat内存溢出了,把内存调大些,
      

  26.   

    我觉得 可能是你的Session没有管理好,我也遇到过类似的情况,一个列表页面多刷新几次就没反应了。
    只有重启tomcat才好用,要是这种情况可以看看spring的配置方式,我用的注释型事务。
    而且dwr 也可以用spring的依赖注入模式,说的不对见谅
      

  27.   

    数据库连接关闭没,建议别用spring的事务
      

  28.   


    这种问题的原因很多,你懂的。
    但你的数据库连接肯定是不够的。
    BasicDataSource源码不知道你看过没有。  protected int maxActive = 8;//最大连接数
      protected int maxIdle = 8;//最大空闲连接
      protected int minIdle = 0;//最小空闲连接
      protected int initialSize = 0;//初始化连接
      //......等等等上面这些都是BasicDataSource基本设置,都看得懂的。
    所以,根据自己情况,在<bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"></bean>
    中适当修改一些设置是有必要的。 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver" />
    <property name="url" value="" />
    <property name="username" value="" />
    <property name="password" value="" />
    <property name="initialSize" value=""/>
    <property name="maxIdle" value=""/>
    <property name="minIdle" value=""/>
    <property name="maxActive" value=""/>
    <property name="logAbandoned" value="true/false"/>
    <property name="removeAbandoned" value="true/false"/>
    <property name="removeAbandonedTimeout" value=""/>
    <property name="maxWait" value=""/><!-- 毫秒为单位 -->
    <!-- ......等等等 -->
    </bean>具体值要根据你网站的压力测试情况而定。
    慢慢调试吧。还有,听说一个页面调用Ajax的次数不要太多,因为这样会造成一个客户端打开一个页面相当于同时打开多个页面的请求量。访问量一多,这是呈数量级增长的。所以最好能一次ajax出来的就一次性查询出来。多看看网站性能调优方面的资料。
    当然我也是个外行,希望对你有一点点的帮助。
      

  29.   

    加内存;调优tomcat ;加入memcache等cache以减轻数据库访问压力、
      

  30.   

    奉劝lz,尽量不要使用ajax进行大数据操作,能用servlet、action解决的就不要用ajax。个人感觉ajax做个漂亮的ui还行,其它真的都是浮云
      

  31.   


    这位兄弟,其实我也不想用ajax,,一个首页肯定是查询很多表的数据,,用action去做确实比较麻烦。。
      

  32.   

    应该就是连接数过多ajax 每调用一次开一个连接.你直接用action 的话调用一次就一个。这样可以省多少连接,楼主自己评估下要麻烦还是要打不开吧。
      

  33.   

    一次性请求14个!!为什么不分开来呢?
    第一个请求完了,等100毫秒再去请求下一个!
    setTimeOut('fun',100);
    服务器压力大大减少!
      

  34.   

    用weblogic发布网站,一切就搞定!!
      

  35.   

    怎么会麻烦呢?你加个定时更新就好了,正常访问的时候都是你的静态页面,而且你提到是局域网访问的,那应该不是大批量人访问,怎么会承受不起?看你首页的加载查询好多,说不定你数据量又多造成的原因。
    比如电脑CPU持续高涨,你只有结束占用内存大的程序,但不是长久之计,优化还是关键。
    具体方法还是等大牛出现!
      

  36.   

    Java做网站,性能确实是个棘手问题之前也见过一些用Java开发网站的,也有用SSH的,处理好了应该也可以解决用静态化的比较多,具体怎么回事儿,自己也没做过,关注中
      

  37.   

    仔细分析下后台的错误堆栈,或者借助下工具,比如jprofiler或者jdk自带的jconsole,确定问题出在哪里是关键。lz做了多年的企业级应用,应该不会载到数据库连接池上吧。主要看看内存,tomcat的响应能力
      

  38.   

    首先,要定位瓶颈在哪里,是数据库、应用层、还是服务器线程数、tomcat内存分配或者其他问题。
    其次,可以考虑多个tomcat做个简单的负载均衡。
    网站类系统,页面静态化是必须的。
      

  39.   


    哥们   我的理解是   生成静态页只是给详细页生成的    列表页没办法纯静态(数据经常变,只能用伪静态,没必要检测一下数据有没有更新,如果有又重新生成页面...)至于你出现的问题   建议你检查一下SQL部分   看看是不是SQL查询引起了数据库线程死锁   最终造成程序池满了   导致了问题的出现希望能帮到你!
      

  40.   

    软件行业也是一个很庞大的行业,也存在隔行如隔山的情况。
    虽然基础原理大家都明白,但是不一定对最新的技术熟悉,对自己工作范围外的技术学习。
    java也是一个用途很广的语言,
    不会做网站也无可厚非啊。就好象我们部门一直是做服务器开发的,重来不用数据库,对数据库不熟悉又有什么错。
    那么多知识,那么多技巧,吾生也有涯,而知无涯。
    能精通一门就很不错了。
      

  41.   

    哥..sessio.close() 啊 切记切记。
      

  42.   

    搞了一年的网站开发,想换工作了。开发网站不需要用到ssh框架,用太多的框架反而会很慢。我们公司都是只用一个struts(MVC模式)。都是用Action跳转的,我觉得网站要注意的是在Action和页面上要注意释放资源,这样响应的比较快。o(︶︿︶)o 唉搞网站开发没前途啊,学不到什么东西!想做更深一点的程序。
      

  43.   

    要查询的时候再AJAX,不要一上来初始化就全查询,这样AJAX还有啥用
      

  44.   

    如果首页要加载的数据量太大,又不是太经常变动的话,考虑下Hibernate的二级缓存吧!
      

  45.   

    访问时间一长页面就卡住,肯能是数据库连接没有释放,不知道你有没有用到流,看看有没有close掉
      

  46.   

    话说,楼主说了是局域网内用户访问的网站,所以从用户数量角度来说应该是不大的,那么造成服务器挂掉的原因基本上也就是数据的请求压力大了。人不多,但是每个人的访问可能都造成了比较大的请求压力。其实从个人经验来讲,也提不出什么更好的办法了,相关的解决方案上面的兄弟们都说的差不多了。我加上个人经验帮你总结总结:
    1、首页尽量做成静态的,其他页做不做还好。从你的描述来讲,貌似也就首页压力会很大。
    2、你说程序用了SSH,那个Hibernate要做优化的。像上面那位兄弟说的,可以启用二级缓存。另外对于前台来讲,可能有一些数据查询挺麻烦的,建议你查这些数据时候可以直接用Spring的JdbcTemplate,而不是直接用Hibernate的查询。
    3、加大连接池的最大连接数。建议不要增加JVM的内存。
    4、连接池可以换成proxool试试。我以前做的项目遇到过使用dbcp和c3p0无法自动关闭连接的情况。另外proxool提供了监视功能,你可以查看是否有长时间的连接被占用。我本来还想写5来着,但是忘了…… 真纠结求指正,勿喷
      

  47.   

    检查数据库连接是否都已关闭呢?
    ---------------------
    http://www.mowker.com/view/
      

  48.   

    <script type="text/javascript">
    var dep = "40288a3925da98f90125daa35aa6000e";
    $(document).ready(function(){
    queryAffiche(dep);
    disSysTime();
    queryNewSlidesPic(dep, 4, "n");
    queryWorkTask(dep, 8);
    queryArticle("40288a3c3146af43013146e51b64000c", 10, "news ul", 19);
    queryArticle("40288a3c3146af43013146e57aca000d", 10, "f2-1 ul", 19);
    queryArticle("40288a3c326c3f9001326c7fe0e20006", 10, "f2-2 ul", 26);
    queryArticle("40288a3c334868de01334ab1ec6a000e", 10, "f2-3 ul", 19);
    querySafetyDays(dep);
    queryMetting(dep, '0');
    setLeftPosition();
    queryLatestPhotoAlbum(dep, 6);
    queryNavFance(dep);
    queryPersonInfo();
    });
    </script>楼主,你这每个query是不是就用ajax访问后一次啊,干嘛分这么多次啊,能不能合到一个请求里面啊,你这来来回回要交互多少次啊,这也是性能资源浪费啊
      

  49.   

    无语,还说搞了5年的java开发?怎么搞的啊
      

  50.   

    因为 tomcat 处理动态内容之外,还要处理静态内容,因此会造成性能低下!网站的话一般由 Web 服务器采用反向代理的方式实现动静分离。现在常用的有 Apache, Nginx 等。静态资源交给 Web 服务器去处理,而应用服务器只处理动态内容。比如,可以把 *.htm 的请求作为动态内容 upstream 至应用服务器,像 .css, .js, .jpg 等静态资源使用 Web 服务器处理。动静分离的话可以大大地增强应用服务器的处理能力,而且也符合各司其责,因为应用服务器在处理静态资源上远逊于 Web 服务器。为了给网站提速,可以充分利用浏览器的并发连接数,一般在 5~6 个。这样的话,可以将静态资源部署在 4 台左右的服务器上,比如:static1.xxx.com; static2.xxx.com, static3.xxx.com, static4.xxx.com。页面上随机引用这些静态服务器上的资源,不建议将静态资源放在 www.xxx.com 下。网站更进一步提速需要:1:对 HTTP 协议有一定的了解,知晓 Expires, Cache-Control, ETag, Last-Modified 等涉及浏览器缓存的 HTTP 头
    2:使用 CDN 技术进行提速
    3:压缩 CSS 和 JS 文件内容
    4:Web 页面尽可能地减少 HTTP 请求数,比如使用 Yahoo! 提出的 Combo Handler,这个可以将多个 js、css 文件合并成为一个 HTTP 请求,比如这样:http://static.xxx.com/combo-handler?js=jquery-min.js,load/load-min.js,cart/cart-min.js&t=20111224.js这样的话,可以把三个 js 文件合并成为一个 HTTP 请求,响应回来的数据就是这三个文件的内容。5:对于页面上的处理可以去下载 YSlow、PageSpeed 等 Firefox 插件,他们会告诉你该怎么做。互联网应用的开发远比应用系统开发复杂数倍,光是访问量就不是应用系统能够比拟的。应用系统的使用者及受众限于部分人群,因此 Web 安全方面的东西可以忽略,但是互联网应用就不可以了!
      

  51.   

       不管我现在网站采用的是一个什么样的框架, 但现在就是存在问题, 或者说那位有经验的兄弟能够给一个比较合理的方案, 很多人都提出, 我的这个页面的JQuery AJAX交互太多, 那不用这种方式用个什么样比较简单的方法去实现,action就不要建议了,做系统可以, 但对于一个页面查询的表格数据太多,我想action也是一样的,只有比我现在的这种方式去查询更麻烦。   昨天我试了一些dwr框架, 这个东西倒是很方便, 在我的基础上我的改动也比较小, 但现在的问题是用dwr写的代码在IE下不执行, Firefox, Chrome浏览器都可以正常显示,好像速度还不错,这个就不知道什么具体原因, 后来网上查说dwr和Jquery有($)冲突, 我就郁闷了, firefox下怎么就没有冲突,,要把$替换成自己定义的一个对象,我的天,,我以前用jquery写的那么多代都替换,该有多麻烦
     
      JAVA做网站我都麻木了, 难道真的是不适合
      

  52.   

    楼主大侠,您做JAVA开发5年,薪水多少K啊?
    透露一下吧,俺想了解一下行情,呵呵
      

  53.   

    太长了  没看完
    我是搞PHP开发的
    以前遇到过类似的问题
    后来检查发现问题出在AJAX请求堆积上
    即:通过AJAX发起的一个请求,当因为某种问题服务器响应缓慢时,一个请求还没走完,另外一个请求又发起了(是指同一个客户端,比如轮询),造成两个请求都卡在那里...这样,越积越多,服务器越是响应不过来,最后,APACHE内存溢出,崩溃掉(windows server系统)。而LINUX系统上虽然不会崩溃,但是也是卡在那里。解决方法就是在轮询的时候,先检测上次请求是否完成,如果不完成,则一直等待。
      

  54.   

    楼主用测试软件测一下如何?比如jmeter。解决问题的关键是要先找到问题。
      

  55.   

    估计是ajax太频繁了,可能数据库连接用完了