问题的产生:
多线程(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数据库连接池
多线程(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数据库连接池
dtFollowCards的Cardid和Fauthor、fpublishtime字段
建索引
最好在表里按他们排序好,
不要用linq, 自己循环检索,判断比CodeNum大还没检索到后面就不用循环了
同理判断比CardID大后面也不用循环了
那循环检索的时候能详细说下吗?
存储过程我之前就用过了。
我觉得这个的问题,是频繁的访问数据库,频繁查询数据是否存在
比如说dtCards中有30W数据,那在判断是否添加的时候理论上 至少要比较30W次,而且是多线程下,也就是说同一时刻 可能有好多个线程在 连接数据库查询数据,所以存储过程也是撑不住的
问题是这个软件在服务器上,占用CPU太多会导致别的程序卡了...还有网站也受不了...
有没有什么方法 减少CPU的使用 或者优化现在的linq to table的?
建议用索引,不要用存储过程,不要用linq
如果CodeNum不多,可以考虑用Dictionary,CodeNum作为key,这样定位起来更快,检索范围更小
并发线程,也就是好多个线程都在调用我在一楼写的那个,如果直接用数据库,数据库撑不住...
因为他每秒都要读好多次数据库
比如说:每个线程(总共20+线程同时运行的)
1、查询数据是否存在及是否需要更新。
2、不存在则获取具体的数据进行更新
3、dtFollowCards和dtCards是多对一的关系,dtFollowCards中有dtCards的主键id,对于dtFollowCards每一条数据是否需要更新都需要进行比较