经过对zblog的代码加以分析,我发觉其缘由是大量并发用户同时对数据库进行写入操作所导致的。
在此,我想到了一个针对该问题的解决办法,那便是采用时间缓存的方式,定时去写数据库。即在特定时间段内,数据仅写入内存,而不写入数据库,等到缓存时间一到,再将内存中的数据写入数据库。如此一来,即便并发量再大,也不会再出现数据库死锁的问题了。
经过初步的代码修改与测试,发现完成修改之后,这个问题就不复存在了。
修改的具体方法是,打开FUNCTION目录下的c_html_js.asp文件,将UpdateCountInfo函数修改为如下代码便可。
Function UpdateCountInfo(id) Dim strLastUpdate Dim intArticleCount Dim aryArticleCount Dim objRS Application.Lock strLastUpdate=Application(ZC_BLOG_CLSID&"LAST_UPDATE") aryArticleCount=Application(ZC_BLOG_CLSID&"CACHE_ARTICLE_VIEWCOUNT") aryArticleCount(id)=aryArticleCount(id)+1 Application(ZC_BLOG_CLSID&"CACHE_ARTICLE_VIEWCOUNT")=aryArticleCount Application.UnLock If IsEmpty(strLastUpdate) Or Not IsDate(strLastUpdate) Then Application.Lock Application(ZC_BLOG_CLSID&"LAST_UPDATE") = Now() strLastUpdate = Application(ZC_BLOG_CLSID&"LAST_UPDATE") Application.UnLock End If If DateDiff("s",strLastUpdate,Now()) > 30 Then '如果当前时间与上次保存计数值的时间差大于设定的时间间隔,则把计数值重新写入数据库 Call OpenConnect() Set objRS=objConn.Execute("SELECT [log_ID],[log_ViewNums] FROM [blog_Article] WHERE [log_ID] =" & id) If (not objRS.bof) And (not objRS.eof) Then intArticleCount=objRS("log_ViewNums") Else intArticleCount=0 End If objRS.Close Set objRS=Nothing If aryArticleCount(id) > intArticleCount Then objConn.Execute("UPDATE [blog_Article] SET [log_ViewNums]=" & CStr(aryArticleCount(id)) & " WHERE [log_ID] =" & id) Application.Lock Application(ZC_BLOG_CLSID&"LAST_UPDATE") = Now() Application.UnLock Else aryArticleCount(id) = intArticleCount Application.Lock Application(ZC_BLOG_CLSID&"CACHE_ARTICLE_VIEWCOUNT")=aryArticleCount Application.UnLock End If Call CloseConnect() End If End Function
另外,Z – Blog 系统默认的留言评论并不会显示用户 IP 地址。经过一些特定的修改操作后,能够实现在留言中增添用户 IP 地址前三位的显示功能,其具体的实现方法如下:
对 c_system_lib.asp 文件中的 Public Function MakeTemplate(strC)函数进行修改,在其中添加下面的语句:
ReDim aryTemplateTagsName(12) ReDim aryTemplateTagsValue(12) aryTemplateTagsName( 12)="article/comment/ip" if AuthorID=1 then aryTemplateTagsValue(12)="" else aryTemplateTagsValue(12)="ip:" + Left(IP, InStrRev(IP, ".")) + "*" end if 修改TArticle的Function Export_CMTandTB()函数,将 objComment.LoadInfoByArray(Array(objRS("comm_ID"),objRS("log_ID"),objRS("comm_AuthorID"),objRS("comm_Author"),objRS("comm_Content"),objRS("comm_Email"),objRS("comm_HomePage"),objRS("comm_PostTime"),"","")) 改为 objComment.LoadInfoByArray(Array(objRS("comm_ID"),objRS("log_ID"),objRS("comm_AuthorID"),objRS("comm_Author"),objRS("comm_Content"),objRS("comm_Email"),objRS("comm_HomePage"),objRS("comm_PostTime"),objRS("comm_IP"),"")) 修改 b_article_comment.html ,增加 <#article/comment/ip#>标签。
完成上述修改之后,文章评论区域就会出现评论者的 IP 地址栏。不过需要注意的是,当评论存在回复情况时,该区域只会留存最后一个回复者的 IP 地址。
@版权声明:
本网站所展示的图片均来源于互联网,我们致力于尊重原创作者的版权。若图片涉及版权问题,或图片所有者不希望图片被展示,请与我们联系,我们将在第一时间进行处理,包括但不限于删除图片。我们对图片的版权问题持开放态度,并愿意与版权所有者进行沟通协商。感谢您的理解与支持。