生·生活

asp.net旅行

 

有感于blogengine sqlprovider

昨天晚上就在弄这个东东
在blogengine本身提供的MSSQLBlogProvider.cs上做了些许修改
数据导入成功后,将blog的defaultProvider换成了sql
但随之问题就来了:
1、载入特别慢,远远慢于xmlprovider
2、发表评论后,迟迟不出现回调的结果,始终显示"saving......"
观察了一下CommentView.ascx.cs的代码,
  1. public void RaiseCallbackEvent(string eventArgument)   
  2.     {   
  3.            
  4.         //部分代码省略   
  5.         Post.AddComment(comment);   
  6.         SetCookie(author, email, website, country);   
  7.   
  8.         string path = "~/themes/" + BlogSettings.Instance.Theme + "/CommentView.ascx";   
  9.   
  10.         CommentViewBase control = (CommentViewBase)LoadControl(path);   
  11.         control.Comment = comment;   
  12.         control.Post = Post;   
  13.   
  14.         using (StringWriter sw = new StringWriter())   
  15.         {   
  16.             control.RenderControl(new HtmlTextWriter(sw));   
  17.             _Callback = sw.ToString();  //这里是评论发表成功后回调返回的值,实际上就是评论列表   
  18.         }   
  19.     }  

继续跟进 Post.AddComment(comment);方法
  1. public void AddComment(Comment comment)   
  2.         {   
  3.             CancelEventArgs e = new CancelEventArgs();   
  4.             OnAddingComment(comment, e);   
  5.             if (!e.Cancel)   
  6.             {   
  7.                 Comments.Add(comment);   
  8.                 DataUpdate(); //跟进这一行代码   
  9.                 OnCommentAdded(comment);   
  10.                 SendNotifications(comment);   
  11.             }   
  12.         }  

DataUpdate
  1. protected override void DataUpdate()   
  2.         {   
  3.             BlogService.UpdatePost(this);  //这里   
  4.             Posts.Sort();   
  5.         }  

在BlogService.UpdatePost中调用了 _provider.UpdatePost(post);方法
_provider.UpdatePost(Post)是个抽象方法,供sqlprovider或xmlprovider重写
在可爱的sqlprovider代码中
  1. public override void UpdatePost(Post post)   
  2.         {   
  3.                
  4.   
  5.             string sqlQuery = "UPDATE be_Posts " +   
  6.                                 "SET Title = @title, Description = @desc, PostContent = @content, " +   
  7.                                 " DateModified = @modified, Author = @Author, " +   
  8.                                 "IsPublished = @published, IsCommentEnabled = @commentEnabled, " +   
  9.                                 "Raters = @raters, Rating = @rating, Slug = @slug,[IsWYSWYG]=@iswyswyg,[IsTop]=@istop " +   
  10.                                 "WHERE PostID = @id";   
  11.   
  12.             SqlParameter[] para = new SqlParameter[13];   
  13.             para[0] = new SqlParameter("@id", post.Id);   
  14.             para[1] = new SqlParameter("@title", post.Title);   
  15.             para[2] = new SqlParameter("@desc", post.Description);   
  16.             para[3] = new SqlParameter("@content", post.Content);   
  17.             para[4] = new SqlParameter("@modified", DateTime.Now);   
  18.             para[5] = new SqlParameter("@author", post.Author ?? string.Empty);   
  19.             para[6] = new SqlParameter("@published", post.IsPublished);   
  20.             para[7] = new SqlParameter("@commentEnabled", post.IsCommentsEnabled);   
  21.             para[8] = new SqlParameter("@raters", post.Raters);   
  22.             para[9] = new SqlParameter("@rating", post.Rating);   
  23.             para[10] = new SqlParameter("@slug", post.Slug);   
  24.             para[11] = new SqlParameter("@iswyswyg", post.IsWYSWYG);   
  25.             para[12] = new SqlParameter("@istop", post.IsTop);   
  26.   
  27.             //更改了post   
  28.             SqlHelper.ExecuteNonQuery(SqlHelper.ConnectionString, CommandType.Text, sqlQuery, para);   
  29.                  
  30.             // 更新Tags   
  31.             UpdateTags(post);   
  32.   
  33.             // 更新Categories   
  34.             UpdateCategories(post);   
  35.   
  36.             // 更新Comments   
  37.             UpdateComments(post);   
  38.   
  39.             // 更新Email Notification   
  40.             UpdateNotify(post);   
  41.         }  

这个方法中做了N多"无用的操作",也许作者在设计时最大程度上在UpdatePost方法中要满足所有post相关的操作,
才会在该方法中连续调用其它数据处理
但这样会造成很多很多的冗余操作,比如:我只提交评论,而UpdatePost中却将Post/comment/Tag/category等全更新了一次!
在数据量大的情况下,这个sql的io并不亚于xml的io操作.
欢迎大家说说自己的看法,作者这样设计的目的是什么?

posted on 2008-08-29 12:37 厦门刀客 阅读(114) 评论(2)  编辑 收藏

导航

统计

公告