系统需要在页面上显示树状的组织架构,数据是从数据库中获取的,有好几种展现形式,且根据登录人不同,显示的内容也不一样,这些都已经实现了,但是每次要显示这几颗树的时候,都要从数据库里面去获取一遍,返回到页面后,页面还要递归显示,性能很差。
现在的改进方案是把后台返回的数据放在session中,这样显示过一遍后,以后就直接从session中取,速度快多了,这样做的缺点是第一次访问仍然会慢,另外,如果访问量很大,就要在session中放入大量内容,担心会将服务器拖垮。由于这些树是系统的核心元素,大部分操作都是围绕着它们展开的,现在设想能不能在系统启动的时候就把这些数据全部读出,缓存起来,以后就直接从缓存中读取,这样的思路对不对呢,如果可行,该怎么实现,请指教。

解决方案 »

  1.   

    最好把数形结构写在子页面里,点数形结构时变化的页面也是在子页面,大框架是不动的;
    就类似于csdn;
    http://community.csdn.net/
      

  2.   

    如果这些树的数据不是用户相关的,可以考虑邦定到servletcontext
      

  3.   

    1种,加载成内存树型结构,省却数据库连接和传输时间;
    2种,应用AJAX,每次请求只返回一层节点;
    3种,根据不同用户确定出所有分类,将不同输出后的表现HTML缓存,不要存储在session中.
      

  4.   

    1种,加载成内存树型结构,省却数据库连接和传输时间;
    2种,应用AJAX,每次请求只返回一层节点;
    3种,根据不同用户确定出所有分类,将不同输出后的表现HTML缓存,不要存储在session中
      

  5.   

    谢谢各位的答复。因为系统整体原因,不想对现有实现作大的改动,还是准备对现有数据作缓存,也就是所谓的内存树型结构吧,所有数据按用户分类后所有类型差不多有100种。
    如果用HTML缓存,怎么做呢?
      

  6.   

    不管是有多少种都好,只要是定量的,能根据用户得到分类即可.
    存储static或者在application上存储缓存.
    请求数据时先在缓存中找对应分类的数据,没找到,就做请求,并将请求完成的HTML流缓存起来便于下次使用,找到了就直接返回.
    看起来你还不需要刷新,要是需要刷新的话,你可以适当增加接口.
      

  7.   

    首先,对于你把数据放到session的这种做法,
    严重不支持!使用缓存的前提是:
    1,该数据更新频率比较低,相对稳定。
    2,该数据被访问的频率高

    这些并不是硬指标,只是在这些情况下,使用缓存,才可以达到提高效率的目的。建议使用hibernate,它的一个很大的优点就是缓存的管理。
      

  8.   

    谢谢大家,我是这样解决的:作了一个listener,在contextInitialized方法中将所有数据取出来,放入ServletContext,以后都直接从context中取,需要更新的时候更新context中的相应内容,最后在contextDestroyed方法中将所有数据销毁。