是这样; 现在做的小项目某个页面的查询数量太多 (打开页面要和数据库交互27次, 而且已经不能再少了), 那么如果100个人同时访问的话就会交互2700次; 这一点儿被告知是通不过性能测试的... 别人建议建立一个静态类, 把查询出来的东西保存在这个静态类的对象中, 然后这个对象是保存在中间件的内存中; 这样访问这个页面的时候就不和数据库交互而是从中间件读取数据; 当然中间件里保存的数据也是要定时更新的, 因为数据库的数据会不断更新么. 这个思想我明白, 但是现在就是实现的问题:1. "中间件" 指的是服务器么? 比如现在用的TomCat?
2. 从数据库中查询并加工后的结果是2个List, 然后拿到页面显示; 那么应该如果设计这个所谓的 "静态类" 呢?
3. 如何把这个静态类的对象保存到中间件? 又如何读取?
4. 服务器如果关闭的话数据会保存下来么?非常感谢!!!!
2. 从数据库中查询并加工后的结果是2个List, 然后拿到页面显示; 那么应该如果设计这个所谓的 "静态类" 呢?
3. 如何把这个静态类的对象保存到中间件? 又如何读取?
4. 服务器如果关闭的话数据会保存下来么?非常感谢!!!!
对,就是你的tomcat,但不是tomcat帮你保存,
还是要你自己写代码来保存,比如,写一个静态类,总之让别的代码能访问到,
负责周期性从数据库更新数据,页面请求的时候(Action也好,Service也好,jsp里的代码也好,都一样),
直接调这个类要数据就行。相当于这个类把数据库操作屏蔽了。
2. 从数据库中查询并加工后的结果是2个List, 然后拿到页面显示; 那么应该如果设计这个所谓的 "静态类" 呢?
因为你有两个list,所以,为了避免产生数据交错,最好定义一个类封装这两个list,
然后再通过静态类提供访问接口和更新接口。
更新线程一定要每次创建一个新的数据对象替换原有对象,而不要在原有对象基础上修改。
如:
public class DBOperator{
static private MyData data;
static public synchronized MyData getData(){
} //这个是给定时更新的线程调用,更新数据的
static public synchronized void updateData(){
}
}public class MyData{
private List data1,data2;
public List getData1(){
}
public List getData2(){
}
}
3. 如何把这个静态类的对象保存到中间件? 又如何读取?
不存在保存到中间件的问题,这句话本身有语病,不过大家都能理解。
如果你是静态类,一旦被jvm加载,就在内存了,也就是所谓的保存在中间件了。4. 服务器如果关闭的话数据会保存下来么?
不会,除非你有特殊的负责保存的逻辑。
2、3、4、关于业务数据缓存
设计缓存要考虑数据的特性:A 数据总量 B 变化频率 C 变化方式
设计缓存的方法:A 内存 B 硬盘文件 C 前置数据库(区别于企业生产库)
惰性数据才考虑载入内存,这类数据用定时更新机制是可行的,但是数据量不能太大;
数据量大,但是单向持续递增的,可以生产出查询HTML页面,生成硬盘文件换查询性能;
数据量大,但变化频繁,这类即席查询避免不了的,多用结果表,尽量减少表关联,减少数据库主机压力;