我正在编写一个有趣的网络抓取工具。
我有一个远程SQL数据库,我想保存有关我访问的每个页面的信息,我正在使用Entity Framework 6来保存数据。为了便于说明,我们假设我想要保存每页的唯一数据是我最后一次访问它。
更新此数据库非常慢。这是我想要快速操作的操作:
目前我每分钟只能进行300次更新。我的SQL服务器实例几乎没有显示任何活动,因此我假设我是客户端绑定的。
我的代码很天真:
public static void AddOrUpdatePage(long id, DataContext db)
{
Page p = db.Pages.SingleOrDefault(f => f.id == id);
if (p == null)
{
// create
p = new Page();
p.id = id;
db.Pages.Add(p);
}
p.lastSeen = DateTime.Now;
db.SaveChanges();
}
我抓取一堆页面(1000s),然后在每个页面的循环中调用AddOrUpdatePage。
似乎获得更多速度的方法是批处理?在给定一组页面ID的情况下,一次从我的数据库中获取1000条记录的最佳方法是什么?在SQL中,我会使用表变量和连接,或者使用冗长的IN子句。