日期:2014-05-17  浏览次数:20773 次

大家的web项目里这种情况都是怎么处理的
有时候仅仅为了得到外键所在表的名称字段而进行级联查询,这么做好像不是很妥当。
我不知道你们的项目中是怎么处理的,我现在的项目里是在服务器启动的时候集中访问数据库,建立好各种key为ID,value为NAME的static Map变量。
然后在这种查询的时候只管查询主表就好了,返回页面的时候用自定义的EL表达式(传ID作为参数)从Map中取得NAME输出。

大概如下:
Java code

//组织类型ID:组织类型名称
    public static Map<Long, String> ORGTYPEID_ORGTYPENAME_MAP = new HashMap<Long, String>();

    /**
     * 服务器启动5秒后执行
     * @author ztx 2010-08-04
     */
    public void runBySeverStart(){
        
        log.info("--------------Start:runByServerStart()-----------------");
        commonService.initOrgType();
        ...
        log.info("--------------End  :runByServerStart()-------------------");
        
    }

    public static String getOrgTypeNameByID(Long orgTypeID) {
        if (EcardParameters.ORGTYPEID_ORGTYPENAME_MAP.containsKey(orgTypeID)) {
            return EcardParameters.ORGTYPEID_ORGTYPENAME_MAP.get(orgTypeID);
        } else {
            return "";
        }
    }
    
    
    <function>
        <description>根据组织类型ID获取组织类型名称</description>
        <name>getOrgTypeNameByID</name>
        <function-class>com.htdz.eCard.common.util.ParameterUtil</function-class>
        <function-signature>java.lang.String getOrgTypeNameByID(java.lang.Long)</function-signature>
    </function>

    ${fun:getOrgTypeNameByID(orgTypeID)}



对于数据量上限不会太大的表,这种形式还可以。但如果碰到消费表等大数据量的表的情况,如果也用这方式,似乎这些Map就很耗费堆的空间了,甚至导致内存溢出。那用什么形式来处理呢?

------解决方案--------------------
看lz是想做缓存吧,大表一般不在应用层做缓存,原因是很多数据没及时用上的,反而占了内存空间,大表用临时表,分区,索引来解决