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

标签 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();
    }
}

每次编写此代码时,我都有一种独特的感觉,即我正在重新发明轮子,而且,每次编写此类代码时,我都会不断更改内容,具体取决于各个部分在特定上下文中是否有意义。

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

更新:在我写完这个之后,我意识到我没有考虑在 JVM 关闭之前刷新缓冲区,所以我在构造函数中添加了一个关闭 Hook 。现在我意识到,如果关闭发生在上次保存后 MIN_SAVE_PERIOD 毫秒内,此代码仍将无法正常工作,因此我可能应该重构 saveData。它又发生了。

最佳答案

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

关于java - 定期保存/刷新/提交 - 这种模式有名称吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4578796/

相关文章:

.net - 从 HDF5DotNet 1.8.7 中删除 H5F.flush()?

c++ - 如何通过具有 1024 字节缓冲区的套接字连接发送 6 个字符的 c 字符串,并强制刷新

java - 实际例子使用Hibernate FlushMode.ALWAYS

java - 无法从 Office 365 门户打开我的应用程序。获取应用程序错误的未定义登录 URL

Java HTTP 服务器和资源

java - Vista 的全局应用程序数据放在哪里?

c++ - std::endl 使 Windows 8 崩溃,使用 MinGW 编译

c++ ofstream指针无法写入磁盘

java - 如何防止用户将重复条目添加到 MySQL 数据库中?

java - Eclipse neon 挂起加载 org.eclipse.ui.navigator