oscache使用和研究

Oscache的使用非常方便,特别是jsp cache用的非常广泛。Oscache的文档中也对jsp cache tag的配置有详细说明,但对如普通pojo对象的cache讲的较少,也许是比较简单的缘故。今天做了个测试方案,写测试案例进行了比较和研究。<o:p></o:p>

测试方案1在本机上直接测试,循环从metabase库中的process_info表取得数据(表中只有2条记录)比较使用cache和不使用cache的性能(为平均值)。

代码如下:

 1 ExpandedBlockStart.gif ContractedBlock.gif public   class  DatabaseCacheTest  extends  TestCase  dot.gif {
 2InBlock.gif    GeneralCacheAdministrator admin = null;
 3InBlock.gif
 4InBlock.gif    protected ApplicationContext ctx;
 5InBlock.gif
 6InBlock.gif    protected ProcessInfoDAO processInfoDAO;
 7InBlock.gif
 8ExpandedSubBlockStart.gifContractedSubBlock.gif    protected void setUp() throws Exception dot.gif{
 9ExpandedSubBlockStart.gifContractedSubBlock.gif        String[] paths = dot.gif"/spring/dataAccessContext.xml",
10ExpandedSubBlockEnd.gif                "/spring/spring-biz-db.xml" }
;
11InBlock.gif        ctx = new ClassPathXmlApplicationContext(paths);
12InBlock.gif
13InBlock.gif        processInfoDAO = (ProcessInfoDAO) ctx.getBean("processInfoDAO");
14InBlock.gif        admin = new GeneralCacheAdministrator();
15ExpandedSubBlockEnd.gif    }

16InBlock.gif
17ExpandedSubBlockStart.gifContractedSubBlock.gif    protected void tearDown() throws Exception dot.gif{
18InBlock.gif        admin.destroy();
19ExpandedSubBlockEnd.gif    }

20InBlock.gif
21ExpandedSubBlockStart.gifContractedSubBlock.gif    public void testGetFromCache() dot.gif{
22InBlock.gif        long t1 = System.currentTimeMillis();
23InBlock.gif
24ExpandedSubBlockStart.gifContractedSubBlock.gif        for (int i = 0; i < 10000; i++dot.gif{
25InBlock.gif            ProcessInfoDO pdo = getProcess("65");
26InBlock.gif            assertEquals(pdo.getProcessName(), "TestProcess");
27ExpandedSubBlockEnd.gif        }

28InBlock.gif        System.out.println(System.currentTimeMillis() - t1);
29InBlock.gif
30ExpandedSubBlockEnd.gif    }

31InBlock.gif
32ExpandedSubBlockStart.gifContractedSubBlock.gif    private ProcessInfoDO getProcessByCache(String id) dot.gif{
33InBlock.gif        ProcessInfoDO pdo;
34ExpandedSubBlockStart.gifContractedSubBlock.gif        try dot.gif{
35InBlock.gif            pdo = (ProcessInfoDO) admin.getFromCache("65");
36InBlock.gif            return pdo;
37ExpandedSubBlockStart.gifContractedSubBlock.gif        }
 catch (NeedsRefreshException e) dot.gif{
38InBlock.gif            pdo = processInfoDAO.selectById(65);
39InBlock.gif            admin.putInCache("65", pdo);
40InBlock.gif            return pdo;
41ExpandedSubBlockEnd.gif        }

42ExpandedSubBlockEnd.gif    }

43InBlock.gif
44ExpandedSubBlockStart.gifContractedSubBlock.gif    private ProcessInfoDO getProcess(String id) dot.gif{
45InBlock.gif        return processInfoDAO.selectById(65);
46ExpandedSubBlockEnd.gif    }

47ExpandedBlockEnd.gif}

48 None.gif


Ø         循环 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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值