在许多应用程序中,频繁访问数据库可能会成为性能瓶颈。为了解决这个问题,可以利用内存缓存技术来提高数据访问速度。本文将介绍如何使用内存缓存来存储和检索数据库中的DataTable
,以及如何通过性能测试来验证缓存策略的有效性。
在数据库应用程序中,经常使用SqlDataAdapter.Fill
方法来从数据库检索数据并存储在DataSet
中。对于那些频繁访问但很少更改的数据表,可以将其存储在内存中以加快数据访问速度。MemoryCache
类提供了Add
方法,允许以键值对的形式将任何对象添加到缓存中。在本项目中,将DataTable
添加到内存缓存中。当需要从表中检索记录时,会检查该表是否已存在于缓存中。如果存在,则从缓存中检索DataTable
;如果不存在,则从数据库中检索并存储在缓存中。在DataTable
中查找记录时,使用DataView
的RowFilter
属性。
为了测试性能,设计了一系列测试套件,测试套件中的表大小从100条记录到2000条记录不等。每个测试套件都会向“Items”表中添加100条随机记录,然后分别在没有缓存和有缓存的情况下,连续检索一条记录一秒钟。每秒检索的次数会被计数并显示在网格上。
使用Visual Studio 2010打开Tests.Cache.vbproj
项目,构建并运行。在出现的表单中,需要定义数据库的连接字符串。选择“文件/重建表”菜单项,这将在数据库中重建“Items”表。点击“准备测试套件”按钮,这将为每个测试套件创建列标题。“随机数”文本框定义了表大小从一个测试套件到下一个测试套件的增量。“最大表大小”文本框定义了最后一个测试套件的表大小。点击“运行测试套件”按钮,执行测试套件。每秒检索的次数将写入网格。
打开提供的Excel文件CacheNotes.xlsx
。将网格中的结果复制粘贴到Excel文件中。具体来说,从网格中复制具有Items_Id = 1
和2
的行,以及标题为“100:4”及以后的列,粘贴到Excel文件的第5行和第6行的B列开始(Excel坐标B5-U6)。查看Excel文件中的图表。很可能,在第一个图表中,带缓存的浅蓝色线(with cache)在没有缓存的深蓝色线(without cache)之上,而在第二个图表中则相反。
保存和加载数据库:可能想要测试保存和加载到数据库是否有效。通过菜单“文件/重建表”重建“Items”表。选择菜单“文件/添加随机”向网格中添加100条随机记录。点击“保存到数据库”按钮将记录保存到数据库。通过菜单“文件/清除”清除网格内容。点击“从数据库加载”按钮从数据库加载记录。
要测试缓存,数据库中必须存在一些数据,例如上述步骤已成功完成。点击“加载”按钮,数据将从缓存中加载。如果数据尚未在缓存中,则从数据库中加载。点击“缓存键”按钮查看缓存项。点击“清空数据库”按钮删除数据库中的数据。点击“加载”按钮,并验证数据是从缓存中加载的,尽管数据库中不存在数据。点击“清除缓存”按钮。点击“加载”按钮,并验证没有数据被加载到网格中。
要测试性能,数据库中必须存在一些数据。要反复从数据库中检索所有记录一秒钟,请点击“重复从数据库加载”按钮。一秒钟后,一个消息框将指示完成的迭代次数。要反复从缓存中检索所有记录一秒钟,请点击“重复加载”按钮。一秒钟后,一个消息框将指示完成的迭代次数。
测试套件由多个测试用例组成。例如,一个测试套件测试了一次带缓存和一次不带缓存的记录检索。但是代码支持每个测试套件的多个测试用例,通过组合三个维度:选择标准:ModCache.GetTestCriteria()
方法可能返回多个不同的选择标准,例如:Items_Id=2
、Name='abc'
;数据访问类:可能有多个数据访问类。这些在DBAccess.DataAccessClasses
中定义。缓存测试:带缓存和不带缓存。
Form1.vb
:这是主表单,包含网格、菜单和按钮。绑定:除了“准备测试套件”和“运行测试套件”之外的所有操作都操作数据集ItemsData1
,该数据集绑定到网格上。操作“准备测试套件”和“运行测试套件”将网格从数据集ItemsData1
解绑,并直接操作网格。并行化:在性能测试期间,重复请求在指定数量的线程中并行运行。有两种不同的方法实现并行请求:ParallelFor
:使用.NET的Parallel.For
语句。ParallelThreads
:生成所需数量的线程。
DBAccess.vb
:封装了不同数据访问类的所有数据库功能。在此版本中,提供了一个数据访问类:MySQLDataAccess
。然而,更大的项目可能还有其他数据访问类,例如在COM+下运行的数据访问类和不在COM+下运行的数据访问类。查看DataAccessComPlus
和DataAccessNonComPlus
的注释,以了解如何在这里集成其他数据访问类。
ItemsData.xsd
:用作用户界面的底层数据结构,以及加载和保存数据到数据库。它与通过菜单项“重建表”创建的“Items”表具有相同的结构,该表反过来使用资源SqlCreateTableItems
中定义的SQL语句。
ModCache.vb
:提供了一些与缓存相关的函数。最重要的一个是FillDataSetFromDataTable
,它通过在DataTable
上创建DataView
并设置DataView
的RowFilter
和Sort
属性来搜索记录。这段代码是不值得缓存超过1000条记录的表的原因,因为对于大表来说,创建DataView
并在DataView
中搜索比在数据库中搜索要慢。