问题的产生:
多线程(20线程以上)下大量的读取数据,并和数据库中的现有数据进行比较,然后将没有的数据添加到数据库中。之前的做法 是直接读取数据库中的数据,结果导致sqlserver占用CPU 60%+ 内存占用1.6G左右。
现在添上了 数据库连接池和数据缓冲池,现在的结果是 sqlserver占用率下来了,但是程序的CPU占用率上去了,达到70%左右。
问问大家有没有好的办法解决多线程 大数据量比较并更新到数据库的方法呀?
现在的方法:
数据缓冲池中 提供的 判断当前数据中是否包含此数据
 public static bool IsCardExist(string code, string sourcehref, out int id,out int followNum)
        {
            bool b = false;
            followNum = 0;
            id = -1;
            var query = from card in dtCards.AsEnumerable()
                        where card.Field<string>("CodeNum").Equals(code) && card.Field<string>("sourceHref").Equals(sourcehref)
                        select card;
            DataRow dr = query.SingleOrDefault<DataRow>();
            if (dr!=null)
            {
                b = true;
                id = int.Parse(dr["id"].ToString());
                followNum = int.Parse(dr["followCount"].ToString());
            }
            return b;
        }
 public static bool IsFollowCardExist(int cardindex, string Fauthor, DateTime Fpublistime)
        {
            bool b = false;
            var query = from fc in dtFollowCards.AsEnumerable()
                        where fc.Field<int>("Cardid") == cardindex && fc.Field<string>("Fauthor").Equals(Fauthor) && fc.Field<DateTime>("fpublishtime").CompareTo(Fpublistime)==0
                        select fc;
            DataRow dr = query.SingleOrDefault<DataRow>();
            if (dr!=null)
            {
                b = true;
            }
            return b;
        }
其中 dtCards 有30W条以上的数据,dtFollowCards有80W左右的数据,这个数据暂时不会增长。
恳求大家给点意见...
linqc#sqlserver数据库连接池

解决方案 »

  1.   

    分别给dtCards的CodeNum和sourceHref字段
          dtFollowCards的Cardid和Fauthor、fpublishtime字段
    建索引
    最好在表里按他们排序好,
    不要用linq, 自己循环检索,判断比CodeNum大还没检索到后面就不用循环了
    同理判断比CardID大后面也不用循环了
      

  2.   

    dtCards 和dtFollowCards 这两个是内存表,两个静态变量这样的话 我是不是可以先把这两个表按某一个排序比如说dtCards中的CodeNum排序,
    那循环检索的时候能详细说下吗?
      

  3.   


    存储过程我之前就用过了。
    我觉得这个的问题,是频繁的访问数据库,频繁查询数据是否存在
    比如说dtCards中有30W数据,那在判断是否添加的时候理论上 至少要比较30W次,而且是多线程下,也就是说同一时刻 可能有好多个线程在 连接数据库查询数据,所以存储过程也是撑不住的
      

  4.   

    你现在这个是用在多线程里面吗,即使是多线程,占用cpu也很正常,几个线程在后台计算,跑满几个cpu也是正常的
      

  5.   

    是多线程,光 更新线程就20个以上,还有日志保存,存储数据库,显示更新进度 等等..,总共下来如果开20个更新线程  总线程会达到36左右。
    问题是这个软件在服务器上,占用CPU太多会导致别的程序卡了...还有网站也受不了...
    有没有什么方法 减少CPU的使用 或者优化现在的linq to table的?
      

  6.   

    线程中等待时间间隔长点
    建议用索引,不要用存储过程,不要用linq
    如果CodeNum不多,可以考虑用Dictionary,CodeNum作为key,这样定位起来更快,检索范围更小
      

  7.   


    并发线程,也就是好多个线程都在调用我在一楼写的那个,如果直接用数据库,数据库撑不住...
    因为他每秒都要读好多次数据库
    比如说:每个线程(总共20+线程同时运行的)
    1、查询数据是否存在及是否需要更新。
    2、不存在则获取具体的数据进行更新
    3、dtFollowCards和dtCards是多对一的关系,dtFollowCards中有dtCards的主键id,对于dtFollowCards每一条数据是否需要更新都需要进行比较