xml缓存类[原创]

说明:最近公司网站流量增加,同时在线1000人就开始很卡,数据库服务器cpu占用经常会达到100%,于是在晚上找资料整理做出这个类,部分借鉴walkmanxml数据缓存类
思路:使用xml作为临时数据库,存放小数量数据,来减轻数据库的压力,查询更加快捷

特点:

读取机制:自动判断有无缓存了的xml文件,当xml文件存在数据,侧从xml获取数据,反之从数据库读取;
缓存机制:根据xml文件生存时间和用户自定义的缓存时间判断缓存有无过期,过期侧生存新的xml文件;

有效减少数据库查询读取次数,缓存数据量小读取更快


修改了一下,加了两个方法,使用更方便

xml缓存类[原创] < %
xml缓存类[原创]
Rem  xml缓存类
xml缓存类[原创]'
--------------------------------------------------------------------
xml缓存类[原创]'
转载的时候请保留版权信息
xml缓存类[原创]'
作者:╰⑥月の雨╮
xml缓存类[原创]'
博客: http://chthp.cnblogs.com/
xml缓存类[原创]'
版本:ver1.0
xml缓存类[原创]'
本类部分借鉴 walkmanxml数据缓存类,使用更为方便 欢迎各位交流进步
xml缓存类[原创]'
--------------------------------------------------------------------
xml缓存类[原创]
Class XmlCacheCls
xml缓存类[原创]    
Private  m_DataConn                 ' 数据源,必须已经打开
xml缓存类[原创]
     Private  m_CacheTime                 ' 缓存时间,单位秒  默认10分钟
xml缓存类[原创]
     Private  m_XmlFile                 ' xml路径,用绝对地址,不需要加扩展名
xml缓存类[原创]
     Private  m_Sql                     ' SQL语句
xml缓存类[原创]
     Private  m_SQLArr                 ' (只读)返回的数据数组
xml缓存类[原创]
     Private  m_ReadOn                 ' (只读)返回读取方式 1-数据库 2-xml 检测用
xml缓存类[原创]
    
xml缓存类[原创]    
' 类的属性=========================================
xml缓存类[原创]
    
xml缓存类[原创]    
' 数据源
xml缓存类[原创]
     Public   Property   Set   Conn(v)
xml缓存类[原创]        
Set  m_DataConn  =  v 
xml缓存类[原创]    
End Property
xml缓存类[原创]    
Public   Property   Get   Conn 
xml缓存类[原创]        Conn 
=  m_DataConn 
xml缓存类[原创]    
End Property
xml缓存类[原创]    
xml缓存类[原创]    
' 缓存时间
xml缓存类[原创]
     Public   Property   Let   CacheTime(v)
xml缓存类[原创]        m_CacheTime 
=  v 
xml缓存类[原创]    
End Property
xml缓存类[原创]    
Public   Property   Get   CacheTime
xml缓存类[原创]        CacheTime 
=  m_CacheTime 
xml缓存类[原创]    
End Property
xml缓存类[原创]    
xml缓存类[原创]    
' xml路径,用绝对地址
xml缓存类[原创]
     Public   Property   Let   XmlFile(v)
xml缓存类[原创]        m_XmlFile 
=  v 
xml缓存类[原创]    
End Property
xml缓存类[原创]    
Public   Property   Get   XmlFile
xml缓存类[原创]        XmlFile 
=  m_XmlFile 
xml缓存类[原创]    
End Property
xml缓存类[原创]    
xml缓存类[原创]    
' Sql语句
xml缓存类[原创]
     Public   Property   Let   Sql(v)
xml缓存类[原创]        m_Sql 
=  v 
xml缓存类[原创]    
End Property
xml缓存类[原创]    
Public   Property   Get   Sql 
xml缓存类[原创]        Sql 
=  m_Sql 
xml缓存类[原创]    
End Property
xml缓存类[原创]    
' 返回记录数组
xml缓存类[原创]
     Public   Property   Get   SQLArr 
xml缓存类[原创]        SQLArr 
=  m_SQLArr 
xml缓存类[原创]    
End Property
xml缓存类[原创]    
xml缓存类[原创]    
' 返回读取方式
xml缓存类[原创]
     Public   Property   Get   ReadOn 
xml缓存类[原创]        ReadOn 
=  m_ReadOn 
xml缓存类[原创]    
End Property
xml缓存类[原创]    
xml缓存类[原创]    
' 类的析构=========================================
xml缓存类[原创]
    
xml缓存类[原创]    
Private   Sub  Class_Initialize()     ' 初始化类
xml缓存类[原创]
        m_CacheTime = 60 * 10       ' 默认缓存时间为10分钟
xml缓存类[原创]
     End Sub
xml缓存类[原创]    
xml缓存类[原创]    
Private   Sub  Class_Terminate()     ' 释放类
xml缓存类[原创]
        
xml缓存类[原创]    
End Sub
xml缓存类[原创]    
xml缓存类[原创]    
' 类的公共方法=========================================
xml缓存类[原创]
    
xml缓存类[原创]    
Rem  读取数据
xml缓存类[原创]
     Public   Function  ReadData
xml缓存类[原创]        
If  FSOExistsFile(m_XmlFile)  Then      ' 存在xml缓存,直接从xml中读取
xml缓存类[原创]
            ReadDataFromXml
xml缓存类[原创]            m_ReadOn
= 2
xml缓存类[原创]        
Else
xml缓存类[原创]            ReadDataFromDB
xml缓存类[原创]            m_ReadOn
= 1
xml缓存类[原创]        
End   If  
xml缓存类[原创]    
End Function
xml缓存类[原创]    
xml缓存类[原创]    
Rem  写入XML数据
xml缓存类[原创]
     Public   Function  WriteDataToXml
xml缓存类[原创]        
If  FSOExistsFile(m_XmlFile)  Then     ' 如果xml未过期则直接退出
xml缓存类[原创]
             If   Not  isXmlCacheExpired(m_XmlFile,m_CacheTime)  Then    Exit   Function  
xml缓存类[原创]        
End   If
xml缓存类[原创]        
Dim  rs
xml缓存类[原创]        
Dim  xmlcontent
xml缓存类[原创]        
Dim  k
xml缓存类[原创]        xmlcontent 
=   ""
xml缓存类[原创]        xmlcontent 
=  xmlcontent  &   " <?xml version=""1.0"" encoding=""gb2312""?> "   &  vbnewline
xml缓存类[原创]        xmlcontent 
=  xmlcontent  &   "  <root> "   &  vbnewline
xml缓存类[原创]        k
= 0
xml缓存类[原创]        
Set  Rs  =  Server.CreateObject( " Adodb.Recordset " )
xml缓存类[原创]        Rs.open m_sql,m_DataConn,
1
xml缓存类[原创]        
While   Not  rs.eof
xml缓存类[原创]            xmlcontent 
=  xmlcontent  &   "   <item  "
xml缓存类[原创]            
For   Each  field In rs.Fields
xml缓存类[原创]                xmlcontent 
=  xmlcontent  &  field.name  &   " ="" "   &  XMLStringEnCode(field.value)  &   " ""  "
xml缓存类[原创]            
Next  
xml缓存类[原创]            rs.movenext
xml缓存类[原创]            k
= k + 1
xml缓存类[原创]            xmlcontent 
=  xmlcontent  &    " ></item> "   &  vbnewline
xml缓存类[原创]        
Wend
xml缓存类[原创]        rs.close
xml缓存类[原创]        
Set  rs  =   Nothing
xml缓存类[原创]        xmlcontent 
=  xmlcontent  &   "  </root> "   &  vbnewline
xml缓存类[原创]        
xml缓存类[原创]        
Dim  folderpath
xml缓存类[原创]        folderpath 
=   Trim ( left (m_XmlFile, InstrRev (m_XmlFile, " \ " ) - 1 ))
xml缓存类[原创]        
Call  CreateDIR(folderpath & "" ' 创建文件夹
xml缓存类[原创]
        WriteStringToXMLFile m_XmlFile,xmlcontent
xml缓存类[原创]    
End Function
xml缓存类[原创]    
xml缓存类[原创]    
' 类的私有方法=========================================
xml缓存类[原创]
    
xml缓存类[原创]    
Rem  从Xml文件读取数据
xml缓存类[原创]
     Private   Function  ReadDataFromXml    
xml缓存类[原创]        
Dim  SQLARR()             ' 数组
xml缓存类[原创]
         Dim  XmlDoc               ' XmlDoc对象
xml缓存类[原创]
         Dim  objNode              ' 子节点
xml缓存类[原创]
         Dim  ItemsLength          ' 子节点的长度
xml缓存类[原创]
         Dim  AttributesLength     ' 子节点属性的长度
xml缓存类[原创]
         Set  XmlDoc = Server.CreateObject( " Microsoft.XMLDOM " )
xml缓存类[原创]        XmlDoc.Async
= False  
xml缓存类[原创]        XmlDoc.Load(m_XmlFile)
xml缓存类[原创]        
Set  objNode = XmlDoc.documentElement   ' 获取根节点
xml缓存类[原创]
        ItemsLength = objNode.ChildNodes.length   ' 获取子节点的长度
xml缓存类[原创]
         For  items_i = 0   To  ItemsLength - 1
xml缓存类[原创]            AttributesLength
= objNode.childNodes(items_i).Attributes.length  ' 获取子节点属性的长度
xml缓存类[原创]
             For  Attributes_i = 0   To  AttributesLength - 1
xml缓存类[原创]                
ReDim  Preserve SQLARR(AttributesLength - 1 ,items_i)
xml缓存类[原创]                SQLArr(Attributes_i,items_i) 
=  objNode.childNodes(items_i).Attributes(Attributes_i).Nodevalue
xml缓存类[原创]            
Next
xml缓存类[原创]        
Next
xml缓存类[原创]        
Set  XmlDoc  =   Nothing  
xml缓存类[原创]        m_SQLArr 
=  SQLARR
xml缓存类[原创]    
End Function
xml缓存类[原创]    
xml缓存类[原创]    
Rem  从数据库读取数据
xml缓存类[原创]
     Private   Function  ReadDataFromDB
xml缓存类[原创]        
Dim  rs
xml缓存类[原创]        
Dim  SQLARR()
xml缓存类[原创]        
Dim  k
xml缓存类[原创]        k
= 0
xml缓存类[原创]        
Set  Rs  =  Server.CreateObject( " Adodb.Recordset " )
xml缓存类[原创]        Rs.open m_sql,m_DataConn,
1
xml缓存类[原创]        
If   Not  (rs.eof  and  rs.bof)  Then
xml缓存类[原创]            
While   Not  rs.eof
xml缓存类[原创]                
Dim  fieldlegth
xml缓存类[原创]                fieldlegth 
=  rs.Fields.count
xml缓存类[原创]                
ReDim  Preserve SQLARR(fieldlegth,k)
xml缓存类[原创]                
Dim  fieldi
xml缓存类[原创]                
For  fieldi  =   0   To  fieldlegth - 1
xml缓存类[原创]                    SQLArr(fieldi,k) 
=  rs.Fields(fieldi).value
xml缓存类[原创]                
Next  
xml缓存类[原创]                rs.movenext
xml缓存类[原创]                k
= k + 1
xml缓存类[原创]            
Wend
xml缓存类[原创]        
End   If
xml缓存类[原创]        rs.close
xml缓存类[原创]        
Set  rs  =   Nothing  
xml缓存类[原创]        m_SQLArr 
=  SQLArr
xml缓存类[原创]    
End Function
xml缓存类[原创]    
xml缓存类[原创]    
' 类的辅助私有方法=========================================
xml缓存类[原创]
    
xml缓存类[原创]    
Rem  写xml文件
xml缓存类[原创]
     Private   Sub  WriteStringToXMLFile(filename,str)
xml缓存类[原创]        
Dim  fs,ts
xml缓存类[原创]        
Set  fs =   createobject ( " scripting.filesystemobject " )
xml缓存类[原创]        
If   Not   IsObject (fs)  Then   Exit   Sub          
xml缓存类[原创]        
Set  ts = fs.OpenTextFile(filename, 2 , True )
xml缓存类[原创]        ts.writeline(str)
xml缓存类[原创]        ts.close
xml缓存类[原创]        
Set  ts = Nothing
xml缓存类[原创]        
Set  fs = Nothing
xml缓存类[原创]    
End Sub
xml缓存类[原创]    
xml缓存类[原创]    
Rem  判断xml缓存是否到期
xml缓存类[原创]
     Private   Function  isXmlCacheExpired(file,seconds)
xml缓存类[原创]        
Dim  filelasttime
xml缓存类[原创]        filelasttime 
=  FSOGetFileLastModifiedTime(file)
xml缓存类[原创]        
If   DateAdd ( " s " ,seconds,filelasttime)  <   Now   Then
xml缓存类[原创]            isXmlCacheExpired 
=   True  
xml缓存类[原创]        
Else
xml缓存类[原创]            isXmlCacheExpired 
=   False
xml缓存类[原创]        
End   If  
xml缓存类[原创]    
End Function
xml缓存类[原创]    
xml缓存类[原创]    
Rem  得到文件的最后修改时间
xml缓存类[原创]
     Private   Function  FSOGetFileLastModifiedTime(file)
xml缓存类[原创]        
Dim  fso,f,s   
xml缓存类[原创]        
Set  fso = CreateObject ( " Scripting.FileSystemObject " )   
xml缓存类[原创]        
Set  f = fso.GetFile(file)   
xml缓存类[原创]        FSOGetFileLastModifiedTime 
=  f.DateLastModified
xml缓存类[原创]        
Set  f  =   Nothing
xml缓存类[原创]        
Set  fso  =   Nothing  
xml缓存类[原创]    
End Function  
xml缓存类[原创]    
xml缓存类[原创]    
Rem  文件是否存在
xml缓存类[原创]
     Public   Function  FSOExistsFile(file)
xml缓存类[原创]        
Dim  fso
xml缓存类[原创]        
Set  fso  =  Server.CreateObject( " Scripting.FileSystemObject " )
xml缓存类[原创]        
If  fso.FileExists(file)  Then
xml缓存类[原创]            FSOExistsFile 
=   true
xml缓存类[原创]        
Else
xml缓存类[原创]            FSOExistsFile 
=   false
xml缓存类[原创]        
End   If  
xml缓存类[原创]        
Set  fso  =   nothing
xml缓存类[原创]    
End Function  
xml缓存类[原创]    
xml缓存类[原创]    
Rem  xml转义字符
xml缓存类[原创]
     Private   Function  XMLStringEnCode(str)
xml缓存类[原创]        
If  str & ""   =   ""   Then  XMLStringEnCode = "" : Exit   Function
xml缓存类[原创]        str 
=   Replace (str, " < " , " &lt; " )
xml缓存类[原创]        str 
=   Replace (str, " > " , " &gt; " )
xml缓存类[原创]        str 
=   Replace (str, " ' " , " &apos; " )
xml缓存类[原创]        str 
=   Replace (str, " "" " , " "")
xml缓存类[原创]
        str  =   Replace (str, " & " , " & " )
xml缓存类[原创]        XMLStringEnCode 
=  str
xml缓存类[原创]    
End Function  
xml缓存类[原创]    
xml缓存类[原创]    
Rem  创建文件夹
xml缓存类[原创]
     Private   function  CreateDIR(byval LocalPath)
xml缓存类[原创]        
On    Error    Resume    Next  
xml缓存类[原创]        
Dim  i,FileObject,patharr,path_level,pathtmp,cpath
xml缓存类[原创]        LocalPath 
=   Replace (LocalPath, " \ " , " / " )
xml缓存类[原创]        
Set   FileObject  =  server.createobject( " Scripting.FileSystemObject " )
xml缓存类[原创]        patharr 
=   Split (LocalPath, " / " )
xml缓存类[原创]        path_level 
=   UBound  (patharr)
xml缓存类[原创]        
For   i  =   0   To   path_level
xml缓存类[原创]            
If   i = 0   Then   
xml缓存类[原创]                pathtmp
= patharr( 0 &   " / "  
xml缓存类[原创]            
Else   
xml缓存类[原创]                pathtmp 
=  pathtmp  &  patharr(i)  &   " / "
xml缓存类[原创]            
End   If  
xml缓存类[原创]            cpath 
=   left (pathtmp, len (pathtmp) - 1 )
xml缓存类[原创]            
If    Not   FileObject.FolderExists(cpath)  Then  
xml缓存类[原创]                
' Response.write cpath
xml缓存类[原创]
                FileObject.CreateFolder cpath
xml缓存类[原创]            
End    If  
xml缓存类[原创]        
Next  
xml缓存类[原创]        
Set   FileObject  =   Nothing  
xml缓存类[原创]        
If   err.number <> 0   Then  
xml缓存类[原创]            CreateDIR 
=   False  
xml缓存类[原创]            err.Clear
xml缓存类[原创]        
Else  
xml缓存类[原创]            CreateDIR 
=   True  
xml缓存类[原创]        
End    If  
xml缓存类[原创]    
End    Function
xml缓存类[原创]
End  Class
xml缓存类[原创]
' 设置缓存
xml缓存类[原创]
Function  SetCache(xmlFilePath,CacheTime,Conn,Sql)
xml缓存类[原创]    
set  cache = new  XmlCacheCls
xml缓存类[原创]    
Set  cache.Conn = Conn
xml缓存类[原创]    cache.XmlFile
= xmlFilePath
xml缓存类[原创]    cache.Sql
= Sql
xml缓存类[原创]    cache.CacheTime
= CacheTime
xml缓存类[原创]    cache.WriteDataToXml
xml缓存类[原创]    
Set  cache  =   Nothing  
xml缓存类[原创]
End Function
xml缓存类[原创]
' 读取缓存
xml缓存类[原创]
Function  ReadCache(xmlFilePath,Conn,Sql,ByRef ReadOn)
xml缓存类[原创]    
set  cache = new  XmlCacheCls
xml缓存类[原创]    
Set  cache.Conn = conn
xml缓存类[原创]    cache.XmlFile
= xmlFilePath
xml缓存类[原创]    cache.Sql
= Sql
xml缓存类[原创]    cache.ReadData
xml缓存类[原创]    ReadCache
= cache.SQLArr
xml缓存类[原创]    ReadOn
= cache.ReadOn
xml缓存类[原创]    
Set  cache  =   Nothing  
xml缓存类[原创]
End Function
xml缓存类[原创]%
>
xml缓存类[原创]

 
使用方法:

1、读取数据

xml缓存类[原创] < ! -- #include file = " include/xmlcachecls.asp "   -->
xml缓存类[原创]strSel
= ""
xml缓存类[原创]ReadOn
= 0
xml缓存类[原创]rsArray
= ReadCache(Server.Mappath( " xmlcache/index/*********.xml " ),Conn,strSel,ReadOn)
xml缓存类[原创]
' response.Write("###### "&ReadOn&" ######<br>") 测试数据从哪里读取的   使用时注释掉
xml缓存类[原创]
If   IsArray (rsArray)  then
xml缓存类[原创]      
for  i = 0   to   ubound (rsarray, 2 )
xml缓存类[原创]            
*********
xml缓存类[原创]      
next
xml缓存类[原创]
End   If
xml缓存类[原创]strSel
= ""
xml缓存类[原创]rsarray
= ""
xml缓存类[原创]


2、缓存数据
cache.asp

xml缓存类[原创] < ! -- #include file = " ../conn.asp "   -->
xml缓存类[原创]
< ! -- #include file = " ../include/xmlcachecls.asp "   -->
xml缓存类[原创]Sql
= ""
xml缓存类[原创]
call  SetCache(Server.Mappath( " ../xmlcache/index/**********.xml " ), 60 * 10 ,Conn,Sql)  ' 60*10 表示缓存的时间
xml缓存类[原创]

3、调用
在页面底部加入,这样就不会影响页面打开的速度
xml缓存类[原创] < script type = " text/javascript "  src = " cache.asp " ></ script >

你可能感兴趣的:(xml)