Oscache的使用非常方便,特别是jsp cache用的非常广泛。Oscache的文档中也对jsp cache tag的配置有详细说明,但对如普通pojo对象的cache讲的较少,也许是比较简单的缘故。今天做了个测试方案,写测试案例进行了比较和研究。<o:p></o:p>
测试方案1:在本机上直接测试,循环从metabase库中的process_info表取得数据(表中只有2条记录)比较使用cache和不使用cache的性能(为平均值)。
代码如下:
2 GeneralCacheAdministrator admin = null;
3
4 protected ApplicationContext ctx;
5
6 protected ProcessInfoDAO processInfoDAO;
7
8 protected void setUp() throws Exception {
9 String[] paths = { "/spring/dataAccessContext.xml",
10 "/spring/spring-biz-db.xml" };
11 ctx = new ClassPathXmlApplicationContext(paths);
12
13 processInfoDAO = (ProcessInfoDAO) ctx.getBean("processInfoDAO");
14 admin = new GeneralCacheAdministrator();
15 }
16
17 protected void tearDown() throws Exception {
18 admin.destroy();
19 }
20
21 public void testGetFromCache() {
22 long t1 = System.currentTimeMillis();
23
24 for (int i = 0; i < 10000; i++) {
25 ProcessInfoDO pdo = getProcess("65");
26 assertEquals(pdo.getProcessName(), "TestProcess");
27 }
28 System.out.println(System.currentTimeMillis() - t1);
29
30 }
31
32 private ProcessInfoDO getProcessByCache(String id) {
33 ProcessInfoDO pdo;
34 try {
35 pdo = (ProcessInfoDO) admin.getFromCache("65");
36 return pdo;
37 } catch (NeedsRefreshException e) {
38 pdo = processInfoDAO.selectById(65);
39 admin.putInCache("65", pdo);
40 return pdo;
41 }
42 }
43
44 private ProcessInfoDO getProcess(String id) {
45 return processInfoDAO.selectById(65);
46 }
47}
48
Ø 循环 100 次,使用 cache 用时 578ms ,直接从数据库取用时 2015ms 。
Ø 循环1000次,使用cache用时719ms,直接从数据库取用时13984ms。
Ø 循环10000次,使用cache用时2016ms,直接从数据库取用时131188ms。
使用图例比较,系列1表示循环的次数,系列2为使用cache的用时,系列3为不使用cache的用时。可以看出,随着循环次数的增多,使用cache方案的性能优势更加明显。
<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype>
结论:使用cache,随着循环的增多,用时增长较缓慢,而不使用cache基本是等比例增长。在循环次数较多时,使用cache cpu利用率显著提高,能达到90%以上。不使用cache则只能上到50%左右,更多是在等待数据库返回结果。所以使用cache能大大减轻数据库的压力,提高应用服务器的利用率,符合我们对应用服务器进行水平扩展的要求。
<o:p> </o:p>