1) 概述:
听说公司有tc cache,可是没见着它在那里被应用了。而且他平时同事的编码中,每次要用到字典表的数据,总是QueryManager查询数据库。
昨天花了几个小时写了个简单的TCHelper,用户缓存TC表。
一般的情况下,我们字典表是不会发生变化的,有必要去cache我的字典表。
我的大体思路如下:
一:通过xml配置文件,配置所有的字典表查询sql.这样我们的sql和代码可以不在相干了。
这其中的sql有两种可能:
1:没有参数,对于这种sql,在初始化的时候就将得到数据,并且缓存起来。
2:带有参数的,这类sql我们没有办法再初始化的时间就执行,我们在xml中添加了一个简单的attribute
init="false"
二 :重新加载功能,这有两种可能:
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 <a href="martin.xus@gmail.com">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,则返回emptyList
*/
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,则返回emptyList
*/
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 UnsupportedOperationException("不支持params为空的查询!");
String _key = key.toLowerCase();
if (sqlMap.containsKey(_key)) {
TCModel model = (TCModel) sqlMap.get(_key);
//logger.info("model:" + model);
try {
//todo:是否cache该变量
// 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();
}
/**
* 清除指定
*
* @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());
}
}
* 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 <a href="martin.xus@gmail.com">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,则返回emptyList
*/
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,则返回emptyList
*/
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 UnsupportedOperationException("不支持params为空的查询!");
String _key = key.toLowerCase();
if (sqlMap.containsKey(_key)) {
TCModel model = (TCModel) sqlMap.get(_key);
//logger.info("model:" + model);
try {
//todo:是否cache该变量
// 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());
}
}
相关推荐
### Oracle常用数据字典表详解 #### 一、Oracle用户数据字典介绍 在Oracle数据库中,用户数据字典提供了一系列视图,用于查询数据库对象的相关信息,包括但不限于表、索引、序列等。这些视图对理解数据库结构、...
### 一、Cache基本表概述 “Cache基本表”指的是在特定的缓存系统或数据库中,为了优化查询性能而存储的一系列表格。这些表格包含了多种不同类型的数据,如病人信息、科室信息、医嘱信息等。这些表的设计目的是为了...
Cache适用于数据相对固定且频繁访问的场景,如字典表。例如,将库存系统中的产品信息存入Cache,当需要获取产品信息时,直接从Cache中读取,避免频繁的数据库交互,提高系统性能。然而,对于实时变化快速且使用范围...
### Oracle常用数据字典表及动态视图 在Oracle数据库管理中,理解并掌握数据字典表和动态性能视图是非常重要的。它们提供了关于数据库结构、配置和运行时状态的关键信息。本文将详细介绍Oracle中的一些常用数据字典...
### Oracle用户数据字典以及查询表字段 在Oracle数据库中,数据字典是存储数据库元数据(即关于数据的数据)的特殊集合。这些元数据包括了数据库对象的名称、类型、属性等信息。数据字典对于数据库管理员和开发人员...
通过查看P1和P2参数,可以关联到内部数据字典表x$kglpn和x$kglob,以获取更详细的pin信息。例如,P1是Library Cache Handle地址,P2是Library Cache Pin地址。通过这些信息,我们可以进一步分析哪个会话持有pin,...
例如,可以查询`dictionary`表来获取所有数据字典表的名称和解释,通过`dict_column`表来了解数据字典表中的字段详细信息。在查询索引相关数据时,可以使用如`SELECT * FROM dictionary WHERE instr(comments, '...
Oracle 数据库中的数据字典是一系列系统表和视图的集合,用于存储数据库元数据。这些元数据包括了数据库对象(如表、视图、索引等)的定义、权限信息、以及数据库的状态信息等。下面列举了一些常用的数据字典条目...
term_cache 有 4 种实现: term_cache_ets:键和值存储在 ets 表中(一个有序的 set ets 表加上 set ets 表); term_cache_trees:键和值存储在树中(Erlang 模块 gb_trees,1 棵树表示键,1 棵树表示值); term_...
### ORACLE完整数据字典详解 #### 一、概述 Oracle 数据库系统是业界领先的数据库管理系统之一,提供了强大而全面的数据管理功能。...本文介绍了一些常用的数据字典表及其字段,希望对读者有所帮助。
数据字典是Oracle数据库内部维护的一系列表和视图的集合,用于存储关于数据库对象及其属性的元数据。这些元数据包括但不限于表、索引、用户、权限、存储过程等的信息。 ### 2. V$视图与数据字典 在Oracle中,V$...
- **数据字典表**:以"$"结尾,由Oracle系统自动创建,主要用于存储系统级信息。这些表通常不可直接访问,但可以通过视图访问。 - **数据字典视图**:分为静态数据字典视图和动态数据字典视图。 **静态数据字典视图...
静态视图是指存储在数据文件中的数据字典信息,包括数据表、索引、表空间等对象的定义信息。这些信息是持久性的,直到数据库关闭或重启时才会改变。静态视图的示例包括 dba_data_files、dba_db_links、dba_extents、...
SELECT table_name, cache FROM user_tables WHERE INSTR(cache, 'Y') > 0; ``` 这条语句用于列出所有设置了缓存的表。缓存的使用对于提高查询性能非常关键。 #### 10. 查找索引信息 ```sql SELECT index_name, ...
Oracle 数据字典是数据库管理系统 Oracle 中的一个重要组成部分,它存储了关于数据库对象(如表、索引、用户、权限等)的信息。数据字典由一系列的预定义表和视图组成,供数据库管理员 (DBA) 和开发人员查询以获取...
绝对过期会在特定时间后移除缓存项,滑动过期则是在最近访问后的一段时间内有效,而依赖性过期则可以根据其他资源(如数据库表)的状态来决定缓存的生命周期。 在"LookUpDataCacheExample"示例中,我们可以预见到...
公用缓存表(pre_common_cache)** - **功能介绍:**存储了系统级的缓存数据,以提高数据读取速度。 - **应用场景:**优化系统性能,减少服务器负载。 **18. 积分日志表(pre_common_credit_log)** - **功能介绍...
### Discuz! X2.5 数据字典 #### 概述 《Discuz! X2.5 数据字典》是一份详细的文档,旨在为Discuz!... X2.5 数据字典涵盖了系统中几乎所有关键表的信息,对于理解和维护整个系统具有重要的参考价值。
LeetCode_LRU_Cache 问题: 最近最少使用的缓存 目标是设计一种称为最近最少使用 (LRU) 缓存的数据结构。 LRU 缓存是一种缓存类型,当缓存内存达到其限制时,我们会删除最近最少使用的条目。 对于当前问题,将 get ...