Oscache的使用非常方便,特别是jsp cache用的非常广泛。Oscache的文档中也对jsp cache tag的配置有详细说明,但对如普通pojo对象的cache讲的较少,也许是比较简单的缘故。今天做了个测试方案,写测试案例进行了比较和研究。<o:p></o:p>
测试方案1:在本机上直接测试,循环从metabase库中的process_info表取得数据(表中只有2条记录)比较使用cache和不使用cache的性能(为平均值)。
代码如下:

public class DatabaseCacheTest extends TestCase
{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>
914

被折叠的 条评论
为什么被折叠?



