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

its*_*dok 5 java flush

我发现自己一次又一次地遇到类似的问题:有一些代码处理来自用户/网络/某种类型的产品的数据.出于效率原因,我不想打电话flush()或打电话给commit()我收到的每一条数据,但只是偶尔打电话.

我通常会想出这样的代码:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

每次我写这篇文章时,我都会感觉到我正在重新发明轮子,更重要的是,每次编写这种代码时我都会不断更改内容,具体取决于各个部分在特定上下文中是否有意义.

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

更新:在我写完之后,我意识到我没有考虑在JVM关闭之前刷新缓冲区,所以我在构造函数中添加了一个关闭钩子.现在我已经意识到,如果MIN_SAVE_PERIOD在最后一次保存后不到几毫秒的时间内发生关闭,这段代码仍然无法正常工作,所以我应该重构一下saveData.又在发生了.

Axe*_*ine 2

您的代码已经说明了这一点:它称为buffering