Java+SpringMVC中自实现定时加载更新数据库数据到内存的方法

来源:互联网 发布:英语翻译用哪个软件 编辑:程序博客网 时间:2024/06/05 21:54

实现原理

使用static关键字,Bruce Eckel所著的《Thinking in Java》第四版,第五十二页中对static关键字有如下描述:“一旦将什么设为static,数据或方法就不会同那个类的任何实例对象联系到一起。所以尽管从未创建那个类的一个对象,仍能调用一个static方法,或访问一些static数据“、““静态”(Static)是指“位于固定位置”(尽管也在 RAM里)。程序运行期间,静 态存储的数据将随时等候调用。可用static 关键字指出一个对象的特定元素是静态的。但 Java 对象本身永 远都不会置入静态存储空间。 ”。被static关键字所修饰的的方法或者属性,在开辟内存空间时只会开辟一个内存空间,也就是说,无论这个类有多少个实例对象,这些对象使用被static关键字修饰的方法或属性时都会指向同一个内存空间。这就为实现加载公共数据到内存提供了可行性。本例中实现类继承了抽象类,如要新加入内存方法,只需继承InitObject类,实现init()和find()方法,在公共类InitDate的cacheList中加入新加入的类的beanName即可。

注本例中的内存管理方法不完全,还有待加强

实现方法

实现代码如下(其中BeanContext是实现BeanFactory的一个实现类,通过IOC获取对象):
主体类

@Component("Init")public class Init{    private static List<String> cacheList = new ArrayList();    //初始化方法    public void init(){        cacheList.add("RunDate");        loadDate();        new Thread(){            public void run(){                while(run){                    try{                        Thread.sleep(10000);                        loadDate();                    } catch (Exception e){                        e.printStackTrace();                    }                }            }        }.start();    }    public void loadDate(){        for (String beanName : cacheList){            try{                InitObject initObject = BeanContext.getBean(beanName, InitObject.class);                initObject.init();            }catch (Exception e){                e.printStackTrace();            }        }    }    public Map<String, Object> find(String key){        InitObject initObject = BeanContext.getBean(beanName, InitObject.class);        Map<String, Object> map = initObject.find(key);        return map;    }}

抽象类

public abstract InitObject{    public void init();    public Map<String, Object> find();}

继承类(其中dao是数据库查询方法)

@Repository("RunDate")public class RunDate extends InitObject{    @Autowried    private Dao dao;    private static Map<String, Map<String, Object>> map = new HashMap();    @Override    public void init(){        List<Map<String, Object>> lst = dao.getMapper();        String key;        for (Map<String, Object> m : lst){            key = m.get("key1") + "_" + m.get("key2");//可随意写            map.put(key, m);        }    }    @Override    public Map<String, Object> find(String key){        return map.get(key);    }}   

由于本例中结合了SpringMVC,所以在ApplicationContext.xml中加入如下bean即可启动

<bean id="initDate" class="com.initDate" init-method="init"></bean>
阅读全文
0 0