数据库数据载入时缓存问题及注意事项

news/2024/7/20 14:33:54 标签: 数据库, 内存管理

1:问题

在做web开发的时候,有时候会遇到这种情况,数据库里的数据是固定不变的,大概几千条,而页面要载入所有的数据,甚至载入的数据每一条要根据条件判断分好几组显示,这样一来,每一条数据根据组数要判断一次、启动一次数据库;如果是几千条数据,则会出现判断启动数据库次数为:几千条数据*组数;如果里面的逻辑再复杂一点,可能还要*其他...;然后做一次操作也有可能会刷新一次页面,这样直接连接数据库操作,会使得页面载入很慢,有时候都要等上2分钟以上。

2:解决

为了提高页面载入的效率,可以在网站服务器一启动时就将数据库中的数据载入内存,刷新页面的时候只取内存中的数据,这样不用每次都启动数据库;在增删改数据库中的数据时,需要也对内存中的数据进行增删改,以便保持内存数据和数据库中的数据同步;

3:注意

A: 由于要对内存中的数据进行修改,当有多个用户进行操作时,有可能会出现A在修改内存中的记录,而B又要删除内存中的记录,这样就会造成死锁,会报错误,因此在对数据进行增删改的时候,要锁住线程。object obj=new object();   Lock(obj){//do...} 这样,不同的操作就会排队等待,不至于冲突了。

B: 在设计时,一般业务逻辑层会设计一些逻辑对象,用在内存中存储数据库中的数据,对象属性是表结构;也会用到对象与对象之间的组合关系,他用来表达表与表之间的关系,(如果需要对list列表进行复制操作,可以在让逻辑对象类继承ICloneable接口,实现Clone方法就可。)

C: 需要设计一个内存管理类CacheManage,他用来管理所有对内存中数据进行操作的方法;在内存中的底层List<表结构>修改的时候都需要lock,而网页刷新的时候会用到页面层的list<表结构>,只有当底层的List<表结构>修改了才需要重新获取页面层的List;否则不需要获取;在这里需要设置一个开关,以确定是否页面上的List是最新的数据。

为何在内存里要设计两个List(底层List和页面级List)呢??估计是:web开发的独特性;因为不同的人使用终端发送请求,页面会一直不停的刷,如果既使用底层的List来进行增删改,又使用底层的List来获取数据显示,那使用的人越多就越要排队,等待的时间就越久,页面都有可能根本刷不出来,所以页面级List就是底层List的复制品,当底层List没有变化时直接获取页面级的List,当底层的List改变后,就需要将底层List重新复制给页面级的List,以便同步;

 

转载于:https://www.cnblogs.com/Joans/archive/2013/02/18/2886802.html


http://www.niftyadmin.cn/n/1423080.html

相关文章

4 图片水平居中_「4种方案」搞定CSS水平垂直居中

「4种方案」搞定CSS水平垂直居中关注我的头条号&#xff0c;分享更多的技术学习文章&#xff0c;我自己是一名从事了多年开发的web前端老程序员&#xff0c;目前辞职在做自己的web前端私人定制课程&#xff0c;今年我花了一个月整理了一份最适合2020年学习的web前端学习干货&am…

点击展开 表格_手把手教你使用Excel做一个自动化表格

首先从网上截取了今年九月份上海&#xff0c;北京&#xff0c;广东&#xff0c;四川&#xff0c;辽宁五个省份的猪肉价格&#xff0c;今天就来使用这份数据给大家演示如何制作一份自动化表格&#xff01;步骤一&#xff1a;对数据进行处理取消数据原表中的合并单元格&#xff0…

TextBox(richTextBox) 光标和滚动条到文本末尾

richTextBox1.Text richTextBox1.Text strLine "\r\n"; richTextBox1.Select(richTextBox1.TextLength, 0); richTextBox1.ScrollToCaret();转载于:https://www.cnblogs.com/ahuo/archive/2013/02/26/2933512.html

mysql binlog elk_采集MySQL Binlog

本文介绍如何通过日志服务控制台创建Logtail采集配置来采集MySQL Binlog。前提条件已在服务器上安装Logtail&#xff0c;详情请参见说明 目前支持Linux Logtail 0.16.0及以上版本&#xff0c;Window Logtail 1.0.0.8及以上版本。原理Logtail内部实现了MySQL Slave节点的交互协议…

也来学学插件式开发续-利用MEF

前面一个博客&#xff1a;也来学学插件式开发中很多朋友留言说可以用MEF来实现。于是我就试着用MEF实现了一下。 步骤和上一篇差不多&#xff0c;只是加载插件的方式有所不同。这只是一个自己的示例程序&#xff0c;肯定有很多不足之处&#xff0c;欢迎拍砖。 MEF如何工作&…

mysql校对集工具_MySQL字符集及校对规则的理解

一、字符集(Character set)是多个字符(英文字符&#xff0c;汉字字符&#xff0c;或者其他国家语言字符)的集合&#xff0c;字符集种类较多&#xff0c;每个字符集包含的字符个数不同。特点&#xff1a;①字符编码方式是用一个或多个字节表示字符集中的一个字符②每种字符集都有…

RSA非对称加密代码

1. 创建一个CspParameters类的新实例,并传递您要呼叫的密钥容器名称到CspParameters.KeyContainerName域。2. 创建一个新的RSACryptoServiceProvider实例,并传递CsParameter到它的构造器.3. 创建字节数组来保存原始,加密和解密数据.4. 通过字节数组的数据加密方法和加密字节数组…

CentoOS 6.3 升级 python 2.7.3

由于程序需要用到python&#xff0c;而centos 6.3 自带的python 2.6版本太低了&#xff0c;而yum命令只支持系统默认的python 即python2.6&#xff0c; 所以就另外安装一个python 2.7 下载编译安装python 2.7 wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgztar…