我想说,如果您的插入/更新/删除修改其中一个列表的内容,您应该重新查询列表。我的应用程序中有一些缓存的数据表,我使用下面的结构集合来维护它们。这样,很容易清除整个缓存,并且当我询问特定的数据表时,我会检查缓存中是否存在未过期的数据。
Protected Structure CachedDT
#Region "Local Variables"
Public TheDT As DataTable
Public TheExpirationTime As DateTime
Public TheUniqueIdentifier As String
#End Region 'Local Variables
End Structure
Protected cCachedDTs As Dictionary(Of String, CachedDT) = New Dictionary(Of String, CachedDT)
这些生活在我的基类中查询数据库的对象。使用高速缓存的数据表的一个例子是:
<System.Diagnostics.DebuggerStepThrough> _
Public Overrides Function GetPermissionsSystem(ByVal SystemUserName As String) As DataTable
Try
Dim oCmd As New SqlCommand
Dim aDpt As New SqlDataAdapter
Dim aDst As New DataSet
Dim theCached As CachedDT
Dim theCacheName As String = "GetPermissionsSystem|" & SystemUserName
If cCachedDTs.ContainsKey(theCacheName) Then
theCached = cCachedDTs.Item(theCacheName)
If theCached.TheExpirationTime < DateTime.Now Then
cCachedDTs.Remove(theCacheName)
Else
Return theCached.TheDT
End If
End If
With oCmd
.Connection = MyBase.Conn
.CommandType = CommandType.StoredProcedure
.CommandTimeout = MyBase.TimeoutShort
.CommandText = Invoicing.GetPermissionsSystem
.Parameters.Add(GP("@SystemUserName", SystemUserName))
End With
aDpt.SelectCommand = oCmd
aDpt.Fill(aDst)
theCached = New CachedDT
With theCached
.TheUniqueIdentifier = theCacheName
.TheExpirationTime = DateTime.Now.AddSeconds(10)
.TheDT = aDst.Tables(0)
End With
cCachedDTs.Add(theCached.TheUniqueIdentifier, theCached)
Return aDst.Tables(0)
Catch sqlex As SqlException
MyBase.HandelEX(sqlex)
Catch ex As Exception
MyBase.HandleEX(ex)
Finally
MyBase.CloseConn()
End Try
End Function
在上面的例子中,功能检查高速缓存看到一个合适的对象是否存在。如果确实如此,则返回而不是再次访问数据库。最后,新的对象被添加到缓存中。
你所要做的只是提供一些从缓存中删除特定列表的方法。然后,当你做一个插入/更新/删除,确保你清除适当的项目。
良好的后续问题。 – 2010-11-12 20:26:26
“数据可能陈旧吗?如果是这样,多长时间?”:大概1小时,也许1年。主要问题来自不稳定的业务领域。 – boj 2010-11-12 20:28:27