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

Java 定期保存/刷新/提交-此模式有名称吗?,java,flush,Java,Flush,我发现自己一次又一次地面临着一个类似的问题:有一些代码在数据从用户/网络/某种产品到达时进行处理。出于效率考虑,我不想对收到的每一条数据调用flush()或commit(),但只是偶尔调用 我通常会想到这样的代码: class Processor { private final static MAX_SAVE_PERIOD = 60000; private final static MIN_SAVE_PERIOD = 20000; private final stati

我发现自己一次又一次地面临着一个类似的问题:有一些代码在数据从用户/网络/某种产品到达时进行处理。出于效率考虑,我不想对收到的每一条数据调用
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();
    }
}
类处理器{
私有最终静态最大保存期=60000;
私有最终静态最小保存周期=20000;
专用最终静态int MAX_BUFFER=10000;
Arraylist-dataBuffer=新的Arraylist();
私有长lastSave=0;
公共储蓄者(){
新建计时器()。计划(新建计时器任务()){
periodicSave();
},最大保存期,最大保存期);
Runtime.getRuntime().addShutdownHook(新线程(新Runnable()){
公开募捐{
periodicSave();
}
}));
}
公共同步的void processData(数据数据){
添加(数据);
if(dataBuffer.size()>=最大缓冲区){
saveData();
}
}
私有同步无效周期保存(){
如果(!dataBuffer.isEmpty()){
saveData();
}
}
私有void saveData(){
if(System.currentTimeMillis()-lastSave
我有一种明显的感觉,每次我写这篇文章时,我都在重新发明轮子,而且,每次我写这类代码时,我都在不断地改变东西,这取决于不同的部分在特定的上下文中是否有意义

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


更新:写了这篇文章之后,我意识到我没有考虑在JVM关闭之前刷新缓冲区,所以我在构造函数中添加了一个关闭挂钩。现在我意识到,如果关闭发生在上次保存后的
MIN\u SAVE\u PERIOD
毫秒以内,那么此代码仍然无法正常工作,因此我可能应该重构
saveData
。这种情况再次发生。

您的代码已经说明了这一点:它通过有界缓冲区被称为缓冲。请参阅。

谷歌搜索“缓冲模式”和“缓冲习惯用法”不会产生任何有趣的结果。这是因为它是一种无趣的模式吗?维基百科似乎有一个很好的通用定义: