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

本文介绍如何利用Java的static关键字实现数据加载到内存,并通过Spring框架进行整合。具体介绍了static关键字的作用,以及如何在Spring环境中实现数据的定期更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现原理

使用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>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值