cache 사전 표

더 읽 기
1) 개술: 회사 에 tc cache 가 있다 고 들 었 는데 그곳 에서 응용 되 는 것 을 보지 못 했다.그리고 그 는 평소에 동료 들 의 인 코딩 에서 사전 표 의 데 이 터 를 사용 할 때마다 Query Manager 가 데이터 베 이 스 를 조회 합 니 다.어제 몇 시간 동안 간단 한 TCHelper, 사용자 캐 시 TC 표를 썼 습 니 다.일반적인 상황 에서 우리 사전 표 는 변화 가 없 을 것 이 므 로 cache 나의 사전 표 에 갈 필요 가 있다.나의 대체적인 사고방식 은 다음 과 같다. 첫째, xml 프로필 을 통 해 모든 사전 표를 설정 하여 sql 을 조회 합 니 다. 그러면 우리 의 sql 과 코드 는 상관 이 없습니다.이 중 sql 은 두 가지 가능성 이 있 습 니 다.  1: 인자 가 없습니다. 이 sql 에 대해 서 는 초기 화 할 때 데 이 터 를 얻 고 캐 시 합 니 다.  2: 인자 가 있 는 sql 은 초기 화 시간 에 실행 할 수 없습니다. xml 에 간단 한 attribute 를 추가 하 였 습 니 다.
init
=
"
false
"
2. 다시 불 러 오 는 기능 은 두 가지 가능성 이 있 습 니 다.
  1: 사전 표 데이터 재생 변경
  2: 설 정 된 xml 파일 에 변화 가 생 겼 습 니 다.
사전 표 데이터 방출 이 바 뀌 는 상황 에 대해 현재 이 물건 은 간단하게 실 현 될 뿐 데이터 베 이 스 를 검사 하 는 것 이 아니 라 사용자 의 주동 적 인 방법 이 필요 하 다.
TCHelper.touch();
프로필 을 수정 하고 마지막 업데이트 시간 입 니 다.
우 리 는 파일 이 변 화 를 일 으 킬 지 여부 만 검사 하고, 변 화 를 일 으 켜 야 데 이 터 를 다시 불 러 올 수 있 습 니 다.
2) 코드
/**/
/* * Copyright (c) 2005 Print Information System Co.,Ltd. All Rights Reserved. */
package
 com.jxlt.adt.util;
import
 com.ptf.datastore.QueryManager;
import
 com.ptf.util.ClassLoaderUtil;
import
 org.apache.commons.lang.builder.ToStringBuilder;
import
 org.apache.commons.lang.builder.ToStringStyle;
import
 org.apache.log4j.Logger;
import
 org.jdom.Document;
import
 org.jdom.Element;
import
 org.jdom.JDOMException;
import
 org.jdom.input.SAXBuilder;
import
 java.io.File;
import
 java.sql.SQLException;
import
 java.util.
*
;
/** */
/** * 사전 표 cache * * @author  martin xus *  @version 1.0 ,2005-10-26 11:29:33 */
public
 
class
 TCHelper 
{    ///---------------------------------------------------------------    /// Instancd Data    ///---------------------------------------------------------------    private static final Logger logger = Logger.getLogger(TCHelper.class);    private static Map sqlMap = new HashMap();    private static Map cache = new HashMap();    private static long lastModefied;    public static final String CONFIG_FILE = "tc_adt_sql.xml";    //---------------------------------------------------------------    //  static block    //---------------------------------------------------------------    static {        logger. info ("TC 초기 화 Cache..");        init();        logger. info ("TC 초기 화 Cache 완료 ");    }    //---------------------------------------------------------------    //  public method    //---------------------------------------------------------------    /** *//**     * 지정 한 id 에 따라 캐 시 에 있 는 사전 표 데 이 터 를 되 돌려 줍 니 다.     * 우선 다시 불 러 올 필요 가 있 는 지 확인 하고 필요 하 다 면 먼저 불 러 옵 니 다.     *     * @param key xml 에 설 정 된 id     * @return key 에 대응 하 는 사전 표 데이터,     *         대응 하 는 key 가 없 으 면 empty List 로 돌아 갑 니 다.     */    public static List get(String key) {        logger.info("get tc value with key:" + key);        if (StringUtils.isBlank(key))            return null;        if (reload()) {            logger.info("reloading");            init();            logger.info("reloaded");        }        String _key = key.toLowerCase();        if (cache.containsKey(_key))            return getValue(key);        else            return emptyList();    }    /** *//**     * 이 바늘 은 초기 화 (init) 에 초기 화 되 지 않 은 사전 표 입 니 다.     *     * @param key    xml 프로필 에 대응 하 는 id     * @param params sql 매개 변수     * @return key 에 대응 하 는 사전 표 데이터,     *         대응 하 는 key 가 없 으 면 empty List 로 돌아 갑 니 다.     */    public static List get(String key, List params) {        logger.info("PageHelper.getTCValue: key=" + key + " params=" + params);        if (StringUtils.isBlank(key))            return emptyList();        if (null == params)            throw new Unsupported Operation Exception ("params 가 비어 있 는 검색 은 지원 되 지 않 습 니 다!");        String _key = key.toLowerCase();        if (sqlMap.containsKey(_key)) {            TCModel model = (TCModel) sqlMap.get(_key);            //logger.info("model:" + model);            try {                //todo: 이 변 수 를 캐 시 할 지 여부 / /                cache.put(_key, _list);                return QueryManager.excuteSql(model.getSql(), params);            } catch (SQLException e) {                return emptyList();            }        } else {            logger.debug("invalid key!");        }        return emptyList();    }    /** *//**     * 파일 수정 마지막 수정 시간     * 이렇게 하면 사용자 가 사전 표 데 이 터 를 조회 할 때 init 에서 사전 표 데 이 터 를 다시 불 러 옵 니 다.     * 사전 표 데이터 가 수정 되 었 을 때 만 이 방법 을 사용 해 야 합 니 다.     */    public static void touch() {        File file = getFile();        file.setLastModified(System.currentTimeMillis());    }    /** *//**     * 모든 cache 를 삭제 합 니 다. cache 화해시키다 sqlMap     */    public static void clearAll() {        cache.clear();        sqlMap.clear();    }    /** *//**     * 지정 key 에 대응 하 는 사전 표 데이터 지우 기     *     * @param key xml 파일 에 설 정 된 id 이름     */    public static void clear(String key) {        if (StringUtils.isBlank(key))            return;        String _key = key.toLowerCase();        if (cache.containsKey(_key))            cache.remove(_key);    }    //---------------------------------------------------------------    //  private method    //---------------------------------------------------------------    /** *//**     * xml 파일 읽 기, tc 초기 화 cache     */    private static void init() {        logger.info("TCHelper.init() begin");        logger.info("Reading config from " + CONFIG_FILE);        File file = getFile();        lastModefied = file.lastModified();        logger.debug("file loaded.");        Element element = getRootElement(file);        Iterator iterator = element.getChildren().iterator();        while (iterator.hasNext()) {            TCModel model = new TCModel();            Element e = (Element) iterator.next();            String id = e.getAttributeValue("id");            if (StringUtils.isBlank(id))                continue;            String key = id.toLowerCase();            //            model.setId(key);            model.setAmount(e.getAttributeValue("amount") == null ? 2 : Integer.parseInt(e.getAttributeValue("amount")));            model.setInit(e.getAttributeValue("init") == null || Boolean.getBoolean(e.getAttributeValue("init")));            model.setSql(((Element) e.getChildren().get(0)) .getText());            if (model.isInit()) {                cache.put(key, initTCValues(model));            }            sqlMap.put(key, model);        }    }    /** *//**     * @param file     * @return Element     */    private static Element getRootElement(File file) {        try {            SAXBuilder saxbuilder = new SAXBuilder();            Document document = saxbuilder.build(file);            lastModefied = file.lastModified();            return document.getRootElement();        } catch (JDOMException e) {            throw new RuntimeException("JDOMException:" + e.getMessage());        }    }    /** */<

좋은 웹페이지 즐겨찾기