数据库数据载入时缓存问题及注意事项
2013-02-18 16:27
351 查看
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,以便同步;
在做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,以便同步;
相关文章推荐
- C语言中数据类型间的转换问题和注意事项
- 读取数据库数据填充到缓存的问题,及修复方案一则
- Azure Redis 缓存使用注意事项与排查问题文档整理
- mysql通过直接复制数据库文件夹来还原数据时需要注意的问题
- 跨数据库数据复制,如果计算机的语言环境不一样要注意事项
- asp.net中为用户控件添加数据缓存依赖项时要注意的事项
- IE.火狐中href 兼容的注意事项 ,应用中的删除自己所在行数据,在IE上可用,在FF,谷歌等不可用的问题
- Salesforce Dataloader 命令行连接数据库以及导入导出数据常见注意事项
- mysql通过直接复制数据库文件夹来还原数据时需要注意的问题
- SuperMap IS.NET是否使用SuperMap Deskpro出的地图预缓存及使用了预缓存后速度没有明显提高问题注意事项
- 今天碰到了一个问题,数据传到数据库为空,结果没有注意,调试了好久
- 使用SQLite附加(ATTACH)数据库时,需要注意数据文件编码的问题
- 关于数据库中varchar/nvarchar类型数据的获取注意事项
- 数据库存储历史数据设计注意事项
- C# 使用DateTimePicker与数据库中类型为datetime的数据作比较的一些注意事项
- VBA中数据库导出数据到Excel注意事项
- 【转】 数据库中的Halloween问题及其注意事项
- 单表数据加载到TreeView(.Node.Level>=2) "蝴蝶效应" SelectedNode注意事项 效能优化 综合问题
- Hive-1.1.0的注意事项之元数据库建表时的字段编码问题
- 在Servlet中往数据库中写入时间类型数据时的注意事项