- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
NCV5-内存级缓存的技术红皮书
内存级缓存技术红皮书
NC-UAP 5.0
用友NC-UAP
2011-03-21
目 录
第一章 前言 1
第二章 内存占用3
第三章 数据更新6
1. VersionSensitiveMap 6
2. ElementVersionSensitiveMap 7
2.1 ICacheVersionMonitor 8
第四章 结论 10
第 2 页
第一章前言
NC 中的效率问题的通常是由于程序所采用的算法中需要频繁地访问数据库所致.
对于这类问题,通过使用合适的缓存往往能使问题得到根本解决. 这类方法的本
质就是用空间来换取时间,把多次的数据库访问合成少数几次或者一次,批量地
取回数据存放在内存中,把大部分数据库访问转换成对内存的访问,从而显著地
提升程序运行效率.为了使程序运行得更快,通常会采用一定的索引机制,最常见
的就是使用哈希表.下面的代码示例对同样的业务逻辑给出两种不同的实 现方
法,显而易见,使用缓存的算法将比不使用缓存的算法要快很多.
listing 1
/*
*需要频繁访问数据库的算法
*
*/
private void doSomething(String [] pk_deptdocs)
{
for(int i=0;ipk_deptdocs;i++)
{
DeptdocVO vo = (DeptdocVO)
getDeptdocVOFromDB(pk_deptdocs[i]);
dealWithDeptdocVO(vo);
}
}
/*
*使用缓存的算法
*
*/
private void doSomething(String [] pk_deptdocs)
{
DeptdocVO[] vos = getDeptdocVOsFromDB(pk_deptdocs);
Map cache = new HashMap();
for(int i=0;ivos.length;i++)
{
cache.put(vos[i].getPrimaryKey(),vos[i])
}
for(int i=0;ipk_deptdocs;i++)
{
DeptdocVO vo = (DeptdocVO)cache.get(pk_deptdocs[i]);
dealWithDeptdocVO(vo);
}
第 1 页
}
上面的例子对缓存的使用是有效但朴素的.如果doSomething 不是频繁被调用的
话,这样的做法就足够了.但如果这段代码是在服务器端运行,那就有可能频繁地
被多个线程调用,那么就需要考虑更多的问题.上面的实现中缓存是在堆栈中的,
每次调用都要建立缓存.如果每次调用的传入的数组中有相同的元素的话,那么
还是 有很多的数据库访问是可以避免.因此这种情形下就不再适合采用堆栈级
的缓存,而是需要更长生命周期的缓存.一般来说最容易想到的,有时也是唯一的
办法就是 把缓存对象做静态的(static)的.NCV5,在服务器端,还有一种办法就
是把缓存对象注册为一个组件(component),并把其 singleton 属性设置为
true.
但是对于这样长效的缓存又带来另外两个问题.首先是内存占用的问题.对于上
面提到实现方法,缓存的内存无法被虚拟机自动回收,如果有一段时期,该缓存没
有被用到,那么缓存占用的内存实质是一种浪费.而且如果缓存占用的内存过于
巨大甚至会拖垮整个应用,导致性能急剧下降,甚至内存耗尽,产生OutofMemory
异常.
另一个问题是就是数据有效性问题.数据从数据库中加载到内存中之后,很可能
又被修改了.如果缓存没有更新机制,经过一段时间之后,缓存中的数据可能大
文档评论(0)