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()); } } /** */<
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redash에서 풀다운 필터 만들기 ~ BigQuery의 public-data를 사용하여 연습 ~Redash는 SQL이 쓸 수만 있으면, 나머지는 GUI로 플롯을 좋은 느낌으로 만들 수 있으므로 매우 편리합니다. 이 편리한 기능보다 편리하게 사용할 수 있게 되고 싶습니다. 나 자신 SQL 돌출이라고 하는 일도 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.