无状态:如何制作无状态的ASP组件



  般我们在web或其它有关无状态应用中使用组件时脚本运行完毕后我们都会丢失组件所有参照当然可以简单地将组件参照保存在会话(session )变量中但这浪费资源更聪明思路方法是用会话变量或隐式表单标签保存组件些信息当重新制作组件例子时试图用保存在会话变量中信息恢复组件状态但两种思路方法弊端都在于:从资源角度来看过于昂贵甚至恰好难以实现

  很幸运有个好消息我们都知道可持续性整个前提是能够将变量恢复到这样状态以至于组件知道在上次例示中它在哪这有助于组件现在去做它假定要做这个方案个典型例子是网页上资料翻页当用户点击Page Down时我们需要知道我们在前位置 不把变量保存在内存中(如会话变量)如果我们能将它们保存在文件中等以后需要时检索不是会很好吗?用基础数据形式(串和数字)保存数据很容易用对象和会怎样呢?对象和本质上是存储器中 2进制数据流如果我们能读这个数据我们就能将它写进文件以便以后检索有关对象有个好注意尽管情况区别首先你不能用做组件属性(VB6.0)你可以用他们做变量但以后你会碰到路障幸运地是我们为这种情况发现了个工作区

  你可以将所有或部分属性保存在个PropertyBag对象中PropertyBag对象控制在个对象过程中可以保存和恢复信息PropertyBag对象内容(Content)属性提供你任何存在组中 2进制数据流由你来将这些 2进制数据流写进文件中以便日后检索

例子:

比如你有个类MyComp.clsMyDept它有两个属性MyDepartment$ 和 MyEmployees (个ADO记录集对象)

以下是这个类模块代码:

Option Explicit
Option Compare Text

Public MyDepartment As String
Public MyEmployees As ADODB.Record

Dim objBag As New PropertyBag

Private Sub Class_InitProperties
Set MyEmployees = New ADODB.Record
MyEmployees.Fields.Append \"EmpName\", adVarChar, 30
MyEmployees.Fields.Append \"EmpSal\", adCurrency
MyEmployees.Open
End Sub

Public Sub SaveMyProperties
Dim File%, bytRec As Byte
objBag.WriteProperty \"MyDepartment\", MyDepartment
objBag.WriteProperty \"MyEmployees\", MyEmployees
\' Save this data in a file for later retrieval
File = FreeFile
If Dir(\"C:MyData.txt\", vbNormal) = \"\" Then
Else
Kill \"C:MyData.txt\"
End If
Open \"C:MyData.txt\" For Binary Access Write As #File
bytRec = objBag.Contents
Put #File, , bytRec
Close #File
End Sub

Public Sub RestoreMyProperties
Dim File%, bytRec As Byte
\' Read the saved data from the file.
ReDim bytRec(FileLen(\"C:MyData.txt\"))
File = FreeFile
Open \"C:MyData.txt\" For Binary Access Read As #File
Get #File, , bytRec
objBag.Contents = bytRec
Close #File
\' PropertBag restored. Lets restore the properties now.
MyDepartment = objBag.ReadProperty(\"MyDepartment\")
Set MyEmployees = objBag.ReadProperty(\"MyEmployees\")
End Sub


在客户应用中保存属性

Private Sub Command1_Click
Dim objDept As New MyComp.clsMyDept
objDept.MyDepartment = \"Research\"
\' Add _disibledevent=>objDept.MyEmployees!EmpSal = 2500
objDept.MyEmployees.Update
\' Add second employee
objDept.MyEmployees.AddNew
objDept.MyEmployees!EmpName = \"Potter\"
objDept.MyEmployees!EmpSal = 3000
objDept.MyEmployees.Update
\' Save the properties by calling the method from our component
objDept.SaveMyProperties
Set objDept = Nothing
End Sub


取回保存属性

Private Sub Command2_Click
Dim objDept As New MyComp.clsMyDept
\' Restore properties by calling the method from our component
objDept.RestoreMyProperties
\' Lets see what is restored
Debug.Pr objDept.MyDepartment \'Will pr Research

objDept.MyEmployees.MoveFirst
Debug.Pr \"\" & objDept.MyEmployees!EmpName \'Will pr Harry
objDept.MyEmployees.MoveNext
Debug.Pr \"\" & objDept.MyEmployees!EmpName \'Will pr Potter
Set objDept = Nothing
End Sub

  先别激动你在自己应用中运行这个酷件的前必须了解它局限性用于保存时间取决于属性大小和数据类型注意大部分时间用在ReadProperty 和 WriteProperty 中原因很简单当我们处理象ADO记录集这样结构型数据时过程可不象拷贝字节流那样简单数据也得被解释

保存记录集时我观察到以下情况:

1、保存100000行每列有25个记录集用了50秒
2、检索同样数据用了20秒

  有个更好思路方法保存记录集对象他们有自己Save思路方法用Save思路方法保存100000个记录集仅用了6秒用Open思路方法检索保存记录集对象从保存记录集对象中检索100000行用了20秒(和PropertyBag思路方法时间样)

选择使用

  持续ADO记录集为在你应用中使用提供了个好思路方法想想如果你使用起来你就有所有ADO简便思路方法可以使用象FINDSORTFILTER等等实际上如果你观察仔细会发现我们在上述例子中用持续记录集实现了职工记录纯理论化人可能会反对你不得不在你设计中包含ADO而这将增加你分布磁盘大量存储

小结

  在Web类无状态应用中组件可持续性是非常重要功能使用PropertyBag对象保存和检索属性对于记录集对象分别使用ADOSave和Open思路方法保存和检索数据将上述例子作为摸板给每个例子加上变量文件名就可以制作你自己组件


Tags:  asp上传组件 asp无组件上传 无状态协议 无状态

延伸阅读

最新评论

发表评论