Dream Maker 老漂 不要有和人斗的心,你要赢的是你自己!

ASP文本存储方案-FileDB

四月份做个一个短信系统,当时为了节省成本(使用万网的空间,不带SQL数据库空间便宜),使用了ASP+Access开发,最近需要升级,增加一个短信接口。发现现在Access的数据库竟然有170MB。我的天啊,因为查询比较少,不是很耗资源,所以没有检查出来。
仅仅六个月,数据库竟然到了170MB。随着客户业务的增长,可能再过六个月就要到500MB了,真恐怖。主要占空间大小的,就是存储的短信的发送号码,思考再三,决定将所有的保存到文本文件中。于是写下了一个暂时成为FileDB的asp类。

01 Class FileDB
02   Dim fso,IdxKey,DBPath
03   Private Sub Class_Initialize
04     Set fso = Server.CreateObject("Scripting.FileSystemObject")
05     idxKey = "demo::test"
06     DBPath = "DataCenter/File_DB/"
07   End Sub
08   
09   Private Function getPath()
10     Dim tmp
11     getPath = replace(idxKey,"::","/") & ".html"
12   End Function
13   
14   Private Function checkFile(byref fname)
15     fname = Server.Mappath(DBPath & getPath())
16     checkFile = fso.fileexists(fname)
17   End Function
18   
19   Private Sub createPathName(byval idxKey)
20     Dim TmpPa
21     TmpPa = Server.Mappath(DBPath & idxKey)
22     if not fso.folderexists(TmpPa) then
23       if instr(idxKey,"\") > 0 then Call createPathName(left(idxKey,instrrev(idxKey,"\")-1))
24       fso.createfolder(TmpPa)
25     end if
26   End Sub
27   
28   Public Function getTxt()
29     if checkFile(fname) then
30       set Txt = fso.getfile(fname)
31       if Txt.size = 0 then
32         Tmp = ""
33       else
34         Tmp = fso.opentextfile(fname).readall
35       end if
36       set Txt = Nothing
37       getTxt = Tmp
38     else
39       getTxt = ""
40     end if
41   End Function
42   
43   Public Function remove()
44     if checkFile(fname) then
45       fso.deletefile fname
46     end if
47   End Function
48   
49   Public Function Save(byval content)
50     if checkFile(fname) then
51       set fpo = fso.opentextfile(fname,2)
52     else
53       idxKey = replace(idxKey,"::","\")
54       if instr(idxKey,"\")>0 then Call createPathName(left(idxKey,instrrev(idxKey,"\")-1))
55       set fpo = fso.createtextfile(fname)
56     end if
57     fpo.write content
58     fpo.close
59     set fpo = nothing
60   End Function
61 End Class

因为时间比较紧,而且代码比较简单,就不加注释了,实际就是简化了文本文件的操作方法。

 
01 <% Server.ScriptTimeOut=10000 %>
02 <%
03   '数据库链接代码
04   
05   set fdb = new FileDB
06   fdb.DBPath = "../DataCenter/sms_DB/"
07   
08   conn.open constr
09   set rs = server.createobject("ADODB.Recordset")
10   '得到所有没有转换的数据
11   rs.open "select * from sendlog where send_mob not like '%::%'",conn,3,2
12   do while not rs.eof
13     'FileDB 数据存放路径,日期::MD5(ID)
14     idxStr = split(Rs("send_date")," ")(0) & "::" & md5(Rs("send_id"))
15     fdb.IdxKey = idxStr
16     fdb.Save(Rs("send_mob"))
17     Rs("send_mob") = idxStr
18     rs.update
19     rs.movenext
20   loop
21   rs.close
22   conn.close
23   
24   '数据库压缩过程,不是重点,再次不再多述
25   compactdata(DataPath)
26 %>
27 减肥成功,所有数据转存到FileDB中。

执行一下,所有数据就转存好了,读取的时候很简单,指定了 idxStr,用getTxt()即可得到内容。

 
01 set fdb = new FileDB
02 fdb.DBPath = "../DataCenter/sms_DB/"
03 '../DataCenter/sms_DB/aaa/1111.txt
04 fdb.idxKey = "aaa::1111"
05 str1 = fdb.getTxt()
06 '../DataCenter/sms_DB/bbb/ccc/ddd/eee.txt
07 fdb.idxKey = "bbb:ccc::ddd:eee"
08 str2 = fdb.getTxt()
09 '删除 ../DataCenter/sms_DB/bbb/ccc/ddd/eee.txt
10 fdb.remove()
11 '因为文件不存在,得到的值就是空字符串
12 str3 = fdb.getTxt()
13 '将内容保存到../DataCenter/sms_DB/bbb/ccc/ddd/eee.txt,因为不存在则创建,如果存在,则修改。
14 fdb.save("11111")

2010年10月24日更新小Bug,修复了idxKey 定于数据存放在根目录,就会报错的错误

Tags: asp 数据库

发布: 老漂 分类: 网站|站长 评论: 0 浏览: 169
留言列表
发表留言
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。