要求:实现简单的数据缓存方案,将更新的数据保存在本地,下次再访问的时候如果数据没有更新则不需要再访问数据库,直接读取本地文件,大大缩短数据访问时间。
读取数据:加载大数据之前先判断数据库中该表数据是否有更新,有更新的话则访问数据,无更新访问本地缓存的文件。
保存缓存文件:将最新的数据保存到本地。
/// <summary>
/// 读取数据
/// </summary>
private void ReadData()
{
isCache = false;//当前是否是缓存数据的标识
if (File.Exists(cacheFilePath))//有缓存文件
{
string str = File.ReadAllText(cacheFilePath);//读取文件中的文本信息
A0404_FileModel<TestSelectModel> fileModel = JsonConvert.DeserializeObject<A0404_FileModel<TestSelectModel>>(str);//格式化成缓存数据模型
DateTime time = new SystemSqlServeBLL().GetUpdateDateTime("TestSelect");//获取数据库TestSelect表更新时间
//判断数据库更新时间和本地缓存时间是否一致,如果一致则直接获取缓存文件即可
if (time.ToString() == fileModel.Time.ToString())
{
userList = fileModel.DataList;
isCache = true;
MessageBox.Show("当前没有更新读取缓存文件");
}
else
{
userList = tSBLL.GetAllList();
MessageBox.Show("当前有更新读取数据库");
}
}
else//没有找到缓存文件继续从数据库内查找数据
{
userList = tSBLL.GetAllList();//读取数据库数据
MessageBox.Show("当前有更新读取数据库");
}
//将数据集合赋值给表格
var query = from i in userList orderby i.Id select i;
DataTable table = query.CopyToDataTable();
BindingSource source = new BindingSource();
source.DataSource = table;
this.dgv.DataSource = null;
this.dgv.AutoGenerateColumns = false;
this.dgv.DataSource = source;
}
/// <summary>
/// 保存缓存数据
/// </summary>
private void SaveCacheData()
{
//判断是否存在缓存文件,如果不存在先创建
if (!File.Exists(cacheFilePath))
{
FileStream fileStream = File.Create(cacheFilePath);//创建该文件
fileStream.Close();
}
string str = File.ReadAllText(cacheFilePath);//读取文件中的文本信息
A0404_FileModel<TestSelectModel> fileModel = JsonConvert.DeserializeObject<A0404_FileModel<TestSelectModel>>(str);//格式化成缓存数据模型
DateTime sqlTime = new SystemSqlServeBLL().GetUpdateDateTime("TestSelect");//获取数据库TestSelect表更新时间
//判断当前如果已有缓存文件并且缓存文件记录的时间和数据库上记录的时间一致的话则不需要继续保存文件了
if (sqlTime != null && sqlTime.ToString() == fileModel.Time.ToString())
return;
//构建需要保存的缓存文件对象
A0404_FileModel<TestSelectModel> newFileModel = new A0404_FileModel<TestSelectModel>()
{
Time = sqlTime,
DataList = userList
};
string fileStr = JsonConvert.SerializeObject(newFileModel);
File.WriteAllText(cacheFilePath, fileStr);
}