我想說,如果您的插入/更新/刪除修改其中一個列表的內容,您應該重新查詢列表。我的應用程序中有一些緩存的數據表,我使用下面的結構集合來維護它們。這樣,很容易清除整個緩存,並且當我詢問特定的數據表時,我會檢查緩存中是否存在未過期的數據。
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