VB.Net通过保存除了每次从数据库中获取数据之外的数据来优化执行

时间:2013-07-27 09:02:46

标签: vb.net optimization enums structure

我是vb.net中的新手我正在尝试优化我正在处理的代码执行。我正在制作一个有超过45种表格的节目。在每种形式中,调用功能IsPowerUser来检查是超级用户

如果我们可以在登录时存储有关用户的所有详细信息,那么我们需要在每次需要时使用这些值,而不是从数据库中收集数据。可能这个问题属于VB Basics。

1 个答案:

答案 0 :(得分:0)

您可以使用延迟初始化来推迟数据库调用,直到您确实需要该信息(如果有的话),然后存储该值以便重复使用。

Private _isPowerUser As New Lazy(Of Boolean)(AddressOf GetIsPowerUser)

Public Function IsPowerUser() As Boolean
    Return _isPowerUser.Value
End Function

Private Function GetIsPowerUser() As Boolean
    ' Retrieve the information from the database and return
    Return True Or False
End Function

在此示例中,_isPowerUser是使用延迟初始化的支持字段。当有人呼叫IsPowerUser时,它首先被初始化。在幕后,Lazy(Of T)然后调用代理GetIsPowerUser()来执行所有繁重的工作以从数据库中检索值。

Lazy(Of T)只需拨打一次GetIsPowerUser()即可。 换句话说:对IsPowerUser()的任何连续调用都不会触发GetIsPowerUser()

编辑(1/2)

直到.NET 4才引入

Lazy(Of T),所以这里有一个适用于.NET 2及更高版本的代码示例:

Private _isPowerUser As Boolean?
Private lazyLock As New Object

Public Function IsPowerUser() As Boolean
    If Not _isPowerUser.HasValue Then
        SyncLock lazyLock
            If Not _isPowerUser.HasValue Then
                _isPowerUser = GetIsPowerUser()
            End If
        End SyncLock
    End If
    Return _isPowerUser.Value
End Function

Private Function GetIsPowerUser() As Boolean
    ' Retrieve the information from the database and return
    Return True Or False
End Function

编辑(2/2)

我将我的代码示例更改为在多用户环境中工作:

Private _powerUsers As New Dictionary(Of Long, Boolean)
Private ReadOnly LazyLock As New Object


Public Function IsPowerUser(userId As Long) As Boolean
    If Not _powerUsers.ContainsKey(userId) Then
        SyncLock LazyLock
            If Not _powerUsers.ContainsKey(userId) Then
                _powerUsers.Add(userId, GetIsPowerUser(userId))
            End If
        End SyncLock
    End If
    Return _powerUsers.Item(userId)
End Function

Private Function GetIsPowerUser(UId As Long) As Boolean
    ' Retrieve the information from the database and return
    Return True Or False
End Function

用法示例:

    Dim Steven As Long = 454151
    If IsPowerUser(Steven) Then
        Console.WriteLine("Steven is a power user.")
    Else
        Console.WriteLine("Steven is a normal user.")
    End If