Oscache
的使用非常方便,特别是jsp cache
用的非常广泛。Oscache
的文档中也对jsp cache tag
的配置有详细说明,但对如普通pojo
对象的cache
讲的较少,也许是比较简单的缘故。今天做了个测试方案,写测试案例进行了比较和研究。
测试方案1
:在本机上直接测试,循环从metabase库中的process_info表取得数据(表中只有2条记录)比较使用cache和不使用cache的性能(为平均值)。
代码如下:
1
public
class
DatabaseCacheTest
extends
TestCase
{
2
GeneralCacheAdministrator admin = null;
3![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
4
protected ApplicationContext ctx;
5![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
6
protected ProcessInfoDAO processInfoDAO;
7![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
8![](https://i-blog.csdnimg.cn/blog_migrate/a5ca97a1042a494993b61012f0c7f4e7.gif)
protected void setUp() throws Exception
{
9![](https://i-blog.csdnimg.cn/blog_migrate/a5ca97a1042a494993b61012f0c7f4e7.gif)
String[] paths =
{ "/spring/dataAccessContext.xml",
10
"/spring/spring-biz-db.xml" };
11
ctx = new ClassPathXmlApplicationContext(paths);
12![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
13
processInfoDAO = (ProcessInfoDAO) ctx.getBean("processInfoDAO");
14
admin = new GeneralCacheAdministrator();
15
}
16![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
17![](https://i-blog.csdnimg.cn/blog_migrate/a5ca97a1042a494993b61012f0c7f4e7.gif)
protected void tearDown() throws Exception
{
18
admin.destroy();
19
}
20![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
21![](https://i-blog.csdnimg.cn/blog_migrate/a5ca97a1042a494993b61012f0c7f4e7.gif)
public void testGetFromCache()
{
22
long t1 = System.currentTimeMillis();
23![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
24![](https://i-blog.csdnimg.cn/blog_migrate/a5ca97a1042a494993b61012f0c7f4e7.gif)
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![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
30
}
31![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
32![](https://i-blog.csdnimg.cn/blog_migrate/a5ca97a1042a494993b61012f0c7f4e7.gif)
private ProcessInfoDO getProcessByCache(String id)
{
33
ProcessInfoDO pdo;
34![](https://i-blog.csdnimg.cn/blog_migrate/a5ca97a1042a494993b61012f0c7f4e7.gif)
try
{
35
pdo = (ProcessInfoDO) admin.getFromCache("65");
36
return pdo;
37![](https://i-blog.csdnimg.cn/blog_migrate/a5ca97a1042a494993b61012f0c7f4e7.gif)
} catch (NeedsRefreshException e)
{
38
pdo = processInfoDAO.selectById(65);
39
admin.putInCache("65", pdo);
40
return pdo;
41
}
42
}
43![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
44![](https://i-blog.csdnimg.cn/blog_migrate/a5ca97a1042a494993b61012f0c7f4e7.gif)
private ProcessInfoDO getProcess(String id)
{
45
return processInfoDAO.selectById(65);
46
}
47
}
48
![](https://i-blog.csdnimg.cn/blog_migrate/04e85f05536ccd79982bbca17251f63e.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/944d071149be1c8c4402f26bdcd107b0.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/16a9fb34be116f8614241ccc553f3555.gif)
2
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
3
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
4
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
5
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
6
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
7
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
8
![](https://i-blog.csdnimg.cn/blog_migrate/a5ca97a1042a494993b61012f0c7f4e7.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/e1ed2ced3b3e975bd246687204c32ce4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/16a9fb34be116f8614241ccc553f3555.gif)
9
![](https://i-blog.csdnimg.cn/blog_migrate/a5ca97a1042a494993b61012f0c7f4e7.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/e1ed2ced3b3e975bd246687204c32ce4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/16a9fb34be116f8614241ccc553f3555.gif)
10
![](https://i-blog.csdnimg.cn/blog_migrate/84b88d7ce3b476e13678154aa69b5b89.gif)
11
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
12
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
13
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
14
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
15
![](https://i-blog.csdnimg.cn/blog_migrate/84b88d7ce3b476e13678154aa69b5b89.gif)
16
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
17
![](https://i-blog.csdnimg.cn/blog_migrate/a5ca97a1042a494993b61012f0c7f4e7.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/e1ed2ced3b3e975bd246687204c32ce4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/16a9fb34be116f8614241ccc553f3555.gif)
18
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
19
![](https://i-blog.csdnimg.cn/blog_migrate/84b88d7ce3b476e13678154aa69b5b89.gif)
20
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
21
![](https://i-blog.csdnimg.cn/blog_migrate/a5ca97a1042a494993b61012f0c7f4e7.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/e1ed2ced3b3e975bd246687204c32ce4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/16a9fb34be116f8614241ccc553f3555.gif)
22
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
23
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
24
![](https://i-blog.csdnimg.cn/blog_migrate/a5ca97a1042a494993b61012f0c7f4e7.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/e1ed2ced3b3e975bd246687204c32ce4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/16a9fb34be116f8614241ccc553f3555.gif)
25
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
26
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
27
![](https://i-blog.csdnimg.cn/blog_migrate/84b88d7ce3b476e13678154aa69b5b89.gif)
28
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
29
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
30
![](https://i-blog.csdnimg.cn/blog_migrate/84b88d7ce3b476e13678154aa69b5b89.gif)
31
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
32
![](https://i-blog.csdnimg.cn/blog_migrate/a5ca97a1042a494993b61012f0c7f4e7.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/e1ed2ced3b3e975bd246687204c32ce4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/16a9fb34be116f8614241ccc553f3555.gif)
33
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
34
![](https://i-blog.csdnimg.cn/blog_migrate/a5ca97a1042a494993b61012f0c7f4e7.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/e1ed2ced3b3e975bd246687204c32ce4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/16a9fb34be116f8614241ccc553f3555.gif)
35
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
36
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
37
![](https://i-blog.csdnimg.cn/blog_migrate/a5ca97a1042a494993b61012f0c7f4e7.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/e1ed2ced3b3e975bd246687204c32ce4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/16a9fb34be116f8614241ccc553f3555.gif)
38
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
39
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
40
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
41
![](https://i-blog.csdnimg.cn/blog_migrate/84b88d7ce3b476e13678154aa69b5b89.gif)
42
![](https://i-blog.csdnimg.cn/blog_migrate/84b88d7ce3b476e13678154aa69b5b89.gif)
43
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
44
![](https://i-blog.csdnimg.cn/blog_migrate/a5ca97a1042a494993b61012f0c7f4e7.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/e1ed2ced3b3e975bd246687204c32ce4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/16a9fb34be116f8614241ccc553f3555.gif)
45
![](https://i-blog.csdnimg.cn/blog_migrate/7a3782e39bce8b40e9b05a5e4fd452d8.gif)
46
![](https://i-blog.csdnimg.cn/blog_migrate/84b88d7ce3b476e13678154aa69b5b89.gif)
47
![](https://i-blog.csdnimg.cn/blog_migrate/da43bcbc871cd4f18defa9179da7af64.gif)
48
![](https://i-blog.csdnimg.cn/blog_migrate/9723ec7779ef47d51f1f48b9337ffca0.gif)
? 循环100次,使用cache用时578ms,直接从数据库取用时2015ms。
? 循环1000次,使用cache用时719ms,直接从数据库取用时13984ms。
? 循环10000次,使用cache用时2016ms,直接从数据库取用时131188ms。
使用图例比较,系列1表示循环的次数,系列2为使用cache的用时,系列3为不使用cache的用时。可以看出,随着循环次数的增多,使用cache方案的性能优势更加明显。
![](https://i-blog.csdnimg.cn/blog_migrate/5836eaffb3ee50abdc8ca5d25ca757e8.gif)
结论:使用cache,随着循环的增多,用时增长较缓慢,而不使用cache基本是等比例增长。在循环次数较多时,使用cache cpu利用率显著提高,能达到90%以上。不使用cache则只能上到50%左右,更多是在等待数据库返回结果。所以使用cache能大大减轻数据库的压力,提高应用服务器的利用率,符合我们对应用服务器进行水平扩展的要求。
private static GeneralCacheAdministrator gcadmin;
public Object get(String key) {
try {
CachedObject co = (CachedObject) gcadmin.getFromCache(key);
return co.getContents();
} catch (NeedsRefreshException e) {
return null;
}
}
public void put(String key, Object value) {
CachedObject co = new CachedObject(value);
gcadmin.putInCache(key, co);
}
public void remove(String key) {
gcadmin.flushEntry(key);
}
public void removeAll() {
gcadmin.flushAll();
}
CachedObject 是我自己写的通用缓存对象,你可以自己实现一个。
public Object get(String key) {
try {
CachedObject co = (CachedObject) gcadmin.getFromCache(key);
return co.getContents();
} catch (NeedsRefreshException e) {
return null;
}
}
public void put(String key, Object value) {
CachedObject co = new CachedObject(value);
gcadmin.putInCache(key, co);
}
public void remove(String key) {
gcadmin.flushEntry(key);
}
public void removeAll() {
gcadmin.flushAll();
}
CachedObject 是我自己写的通用缓存对象,你可以自己实现一个。