1

我有一个 ClassA 类,它调用另一个类(DAO)来获取查询结果。在特定的业务场景中,

ClassA 使用查询参数调用 DAO 大约 20,000 次。其中,大约 10,000 次 ClassA 向 DAO 发送相同的查询参数集。显然,Resultset 将是相同的并且可以被缓存。

以下是我实现的代码。

Class A

{

.
.
.
.

Map<String, CachData> cachDataMap= new HashMap<String, CachData>();

priavate void getQueryResults(String queryParam)    
{

try {


            Set<String> cacheSet = cachDataMap.keySet();
            CachData cachData = null;
            if(!cacheSet.contains(queryParam))
            {
                dao.getResuslts((queryParam)));
                cachData = new CachData();
                cachData.setResult0(__getStringResult(0));
                cachData.setResult1(__getStringResult(1));
                cachData.setResult2(__getStringResult(2));
                cachData.setResult3(__getStringResult(3));
                cachData.setResult4(__getStringResult(4));
                cachData.setResult5(__getStringResult(5));
                cachDataMap.put(queryParam, cachData);
            }else
            {
                cachData = cachDataMap.get(queryParam);
            }



        } catch(Exception e) {
            //handle here
        }


}

除了使用任何框架,我们还有其他更好的解决方案吗?更好的数据结构或更好的方法.. 为了获得良好的性能?

4

2 回答 2

1

您可以使用ehcache

无论您做什么,都不要使用 Map 作为缓存的接口。一个好的缓存接口将允许实现对缓存进行清理。地图合约不允许这样做。

根据实现,清理可以基于缓存中的时间,或者基于使用统计,或内存可用性,...

您在此处使用的 Map 方法似乎在较长的使用期内容易出现内存不足的情况。

于 2012-12-14T06:53:44.717 回答
0

您可以使用guava 库中的表并使用ehCache将对象按原样保存,键是查询。

于 2012-12-14T06:51:58.107 回答