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 定于数据存放在根目录,就会报错的错误