我的网站里有很多公用资源,例如城市列表。我目前是写在另一个程序集的静态类里面,由静态构造函数进行初始化。但是如果一段时间没人访问网站,Application会被IIS回收掉,恕我基础较差,不知道这个静态类里面的资源会不会同时被回收?另外,这些公用资源有些是依赖于网站的,一定要保证网站可用后才可以初始化数据,我怎么才能知道网站已经可用?

解决方案 »

  1.   

    实际上不仅仅是什么“回收”,放在实际的网站上的asp.net应用程序会随时(因为各种各样没有人能说清的原因)重启。此时当然所有asp.net进程内存数据都丢失了。我不知道你说的“一定要保证网站可用后才可以初始化数据”是什么意思。具体是什么意思,你问做网站的人啊。如果做网站的人说不清楚,就当他是个糊涂蛋,你换一个合作的网站好了。
      

  2.   


    1.看来必须在属性中提供懒加载的方式了,否则第一个访问网站的人就太郁闷了。另外,如果我在Application_End中提供序列化到文件的方式,在Application_Start中序列化回来,不知道这样好不好?2.其实这是由第一个问题来的,意思就是想问静态构造函数的调用顺序,例如:
    A.Instance();
    B.Instance();
    A、B均包含静态构造函数,那么A的静态构造函数一定在B之前被调用吗?
      

  3.   

    Application_End 不一定执行啊!
      

  4.   

    其实说白了,你就是使用Cache了。至于数据是在文本文件还是关系数据,随你。关键是在asp.net应用中其实没有什么静态数据、session集合等等是持久的,只有SessionID是持久的。Cache的思想也许才是“持久”的,因为它直接就把性能和数据持久化考虑到一起,而不是让你只顾性能而忽视asp.net的进程随时会因为自身(或者IIS)维护而回收和重启的特性。
      

  5.   

    只有SessionID是持久的   -->  只有SessionID等cookie是持久的
      

  6.   


    不好意思,那我再问一下,如果我缓存CityInfo。现在有两种方式:
    1.每个用户登录后会使用CityID去查询一个CityInfo,然后缓存到HttpApplication.Cache。
    2.在类中维护一个静态字段CityInfoDictionary,在第一次引用的时候判断是否为空,为空就从数据加载整个CityInfo表(可能有400行,10列),然后每个用户都会访问这个静态字段,从Dictionary中读取数据。使用第一种方式,会造成对数据库的更频繁访问。但使用第二种方式,你说IIS会经常重启网站,那很可能CityInfoDictionary只被访问几次就需要重新加载。一句话就是一次查一条数据和一次查400条数据,时间差有多少?(包括执行计划、IO等步骤)我同时说几乎没有差距,只要CityInfoDictionary会被访问三次以上就值得加载整个表。