2

当发生外部事件(传入测量数据)时,我的 Java 代码中的事件处理程序将被调用。数据应写入 MySQL 数据库。由于这些调用的频率很高(每秒> 1000),我想有效地处理插入。不幸的是,我不是专业的开发人员,也不是数据库白痴。

忽略效率方面,我的代码大致如下所示:

public class X {

    public void eventHandler(data) {
        connection = DriverManager.getConnection()
        statement = connection.prepareStatement("insert …")
        statement.setString(1, data)
        statement.executeUpdate()
        statement.close()
        connection.close()
    }
}

我的理解是,通过在语句上调用addBatch()executeBatch() ,我可以将物理磁盘访问限制为假设每 1000 次插入。但是,正如您在我上面的代码草图中看到的那样,语句对象是在每次调用eventHandler()时新实例化的。因此,我的印象是批处理机制在这种情况下不会有帮助。关闭自动提交然后在连接对象上调用commit()也是如此,因为每次插入后都会关闭该对象。

我可以将局部变量的连接语句转换为类成员,并在程序的整个运行时重用它们。但是始终保持数据库连接打开不是不好的风格吗?

一种解决方案是手动缓冲数据,然后仅在收集适当的批次后才写入数据库。不过到现在我还是希望各位聪明的能告诉我如何让数据库为我做缓冲。

4

2 回答 2

1

我可以将局部变量的连接和语句转换为类成员,并在程序的整个运行时重用它们。但是,始终保持数据库连接打开不是不好的风格吗?

考虑到大多数(数据库)连接池通常配置为始终保持至少一个或多个连接打开,我不会称其为“坏风格”。这是为了避免在每个数据库操作上启动新连接的开销(除非必要,如果所有已打开的连接都在使用中并且池允许更多连接)。

在这种情况下,我可能会采用某种形式的批处理(但当然我不知道您的所有要求/环境等)。如果数据不需要在其他地方立即可用,您可以构建某种形式的作业队列来写入数据,将传入的数据推送到那里并让其他线程负责将其写入 N 大小的数据库批次。看看java.util.concurrent包中有哪些类可用。

于 2013-02-05T21:24:54.430 回答
0

我建议您使用 aLinkedList<>来缓冲数据(如队列),然后在需要时在单独的线程中将数据存储到 dbms 中,定期执行(可能每 2 秒?)

了解如何在 java 中使用链表构造队列

于 2013-02-05T21:01:33.993 回答