首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定期保存/刷新/提交-这个模式有名字吗?

定期保存/刷新/提交-这个模式有名字吗?
EN

Stack Overflow用户
提问于 2011-01-02 14:30:57
回答 2查看 367关注 0票数 5

我发现自己一次又一次地面临着一个类似的问题:当数据从用户/网络/产品中到达时,有一些代码处理数据。出于效率原因,我不想对接收到的每一段数据调用flush()commit(),但只是偶尔调用。

我通常想出这样的代码:

代码语言:javascript
复制
class Processor {
    private final static MAX_SAVE_PERIOD = 60000;
    private final static MIN_SAVE_PERIOD = 20000;

    private final static int MAX_BUFFER = 10000;
    Arraylist<Data> dataBuffer = new Arraylist<Data>();

    private long lastSave = 0;

    public Saver() {
        new Timer().schedule(new TimerTask() {
            periodicSave();
        }, MAX_SAVE_PERIOD, MAX_SAVE_PERIOD);
        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
            public void run() {
                periodicSave();
            }
        }));
    }

    public synchronized void processData(Data data) {
        dataBuffer.add(data);
        if(dataBuffer.size() >= MAX_BUFFER) {
            saveData();
        }
    }

    private synchronzied void periodicSave() {
        if(!dataBuffer.isEmpty()) {
            saveData();
        }
    }

    private void saveData() {
        if (System.currentTimeMillis() - lastSave < MIN_SAVE_PERIOD) return;

        ...        

        lastSave = System.currentTimeMillis();
    }
}

我有一种独特的感觉,我每次写这篇文章的时候都在重新发明轮子,而且,每次我写这种代码时,我都会不断地改变东西,这取决于各个部分在特定的上下文中是否有意义。

在我看来,这是一个非常常见的模式,但我不记得它被命名或实现为库实用程序。只要我必须自己去实现它,每当我重新实现它时,我就一直面临着分析瘫痪的问题。请帮帮我!

UPDATE:写完这篇文章之后,我意识到在JVM关闭之前没有考虑过刷新缓冲区,所以我在构造函数中添加了一个关闭钩子。现在我已经意识到,如果在上次保存后不到MIN_SAVE_PERIOD毫秒的时间内关闭,那么这段代码仍然不能正常工作,所以我可能应该重构saveData。这又发生了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-02 14:40:26

您的代码已经这么说了:它被称为缓冲

票数 2
EN

Stack Overflow用户

发布于 2011-01-02 15:40:04

生产者/消费者通过一个有界的缓冲区。见生产者消费者问题

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4578796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档