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,以便同步;