我在web程序中有
System.Threading.Timer(new System.Threading.TimerCallback(mycass.begin), null, 1000, 0);
//一秒后开始执行mycass.begin,只执行一次。begin(object o)
{
   dosql(System.DateTime.Now);
}
是一个把700万条记录放入内存的操作,由于记录太多,一下读出数据库吃不消,所以递归。
每次读出5000条dosql(DateTime time1) //time1是上次读到那个时间,以便接下去再读。
{
  读出5000记录放入内存,并记下最后一个time1;
  if(还有记录)
  {
    dosql(time1);
  }
}这个过程基本运行到10几分钟时,就回从头开始。(重新执行mycass.begin)
10分钟时已经运行了一半,内存中有300万左右的记录。
怎么回事?可以解决嘛?

解决方案 »

  1.   

    这段代码好像挺奇怪得。
    为什么要用递归呢?应该可以不用得。Timer只执行了一次,没有重复执行。应该问题不大。是不是堆栈溢出了,试一试不用递归。dosql(DateTime time1) //time1是上次读到那个时间,以便接下去再读。 

      while(还有记录)
      {
        读出5000记录放入内存,处理 
      } 

      

  2.   

    百度的贴吧光一个火影忍者吧就有主题数990159个,页数19803页。
    如果根据用户动态去数据库分页取,恐怕数据库性能不行吧。
    而且论坛列表页页很难静态化。所以要尝试新的方法。百度贴吧应该也是用的内存,链表之类的。
    数据记录上千万,用mssql索引设计的在好,也会有瓶颈。还有开心网,谁知道它是不是现去读数据库,还是用了其他什么方法拉?我看他的数据交换也很巨大。
    听同事说,大网站数据库是用硬盘阵列的,前台起多个数据库实例,读同一个硬盘阵列。这些硬件非常贵。