G级Access网站优化

如果做企业站,ASP+Access是一个最佳选择。但是如果Access的数据库达到G级别,那么性能可能就会大大的下降。如果数据库没有优化,打开asp页面几秒是常有的事情。如果一个Access表内几十万条数据,恰巧ASP页面又有几十个查询,可能就悲剧了。网站打开时间要按分钟计算了。

Asp+Access以前数据量少的时候,没有任何问题。数据量一大,各种麻烦的问题就多了起来。总不能让客户等几分钟打开首页把。

最早的解决方案是将index.asp修改成index.res.asp,用XMLHTTP请求index.res.asp,将结果保存为文件、调用时间到文件,然后调用文件的内容,和时间,如果超时后,重新调用。

这种方案也用了很久,虽然解决了问题,但是效果仍不理想。多人同时访问的时候(经常,页面打开很慢),恰巧内容又超时了。仍然会出现服务器宕机的情况。

今天服务器有出现问题,实在受不了,为数据增加索引,效果仍然不明显。想到可以用Application来保存网页缓存。速度有提高,但是离理想的效果还是差很远。

决心大改动,从18点~23点,耗时五个钟头,终于做出了一套比较完美的方案。

	function is_cache(na)
		if application("catseven_cache_" & na) = "" then
			is_cache = false
		else
			if not isdate(application("catseven_cachetime_" & na)) then
				is_cache = false
			else
				da = cdate(application("catseven_cachetime_" & na))
				if datediff("n",da,now()) > 60 then
					is_cache = false
				else
					is_cache = true
				end if
			end if
		end if
	end function

	function do_cache(na,va)
		application("catseven_cache_" & na) = va
		randomize()
		application("catseven_cachetime_" & na) = dateadd("s",cLng(rnd()*6000),now()) 
	end function

	function ech_cache(na)
		response.write application("catseven_cache_" & na)
	end function

na是缓存名,不可重复

	call cachename = "miaoqiyuan"
	if not is_cache(cachename) then
		'执行代码(即以前的代码),结果保存为 tmpstring
		call do_cache(cachename,tmpstring)
	end if
	call ech_cache(cachename)

运行情况如下图所示。

第一个用户完整访问完一次后,其他用户不用读取数据库,直接访问缓存。

在第一个用户访问期间,如果有其他用户访问,已经缓存的部分,也无需读取数据库。所以仅在启动程序池的时候速度会较慢,以后的访问者访问速度会越来越快(已完成的缓存越来越多)。

假如仅一个人访问,一个小时后,缓存超时,再次访问,仍可能出现访问较慢。所以在保存缓存的时候增加了随机到期时间来提高访问速度。缓存有效期是50~60分钟不等。

本文猫七原创,转帖请注明来自苗启源的博客:http://www.miaoqiyuan.cn

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.