gpt4 book ai didi

java - MySQL 和 Java : Insert efficiently as data comes in via events with high frequency

转载 作者:行者123 更新时间:2023-11-29 03:06:16 24 4
gpt4 key购买 nike

当发生外部事件(传入测量数据)时,将调用我的 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() 时,statement 对象都会重新实例化。因此,我的印象是批处理机制在这种情况下不会有帮助。关闭自动提交然后在 connection 对象上调用 commit() 也是一样的,因为每次插入后该对象都会关闭。

我可以将连接语句 从局部变量变成类成员,并在程序的整个运行期间重用它们。但是,始终保持数据库连接打开不是一种糟糕的作风吗?

一种解决方案是手动缓冲数据,然后仅在收集到适当的批处理后才写入数据库。不过到现在还是希望各位高手告诉我怎么让数据库帮我做缓冲。

最佳答案

I could turn connection and statement from local variables into class members and reuse them during the whole runtime of the program. But wouldn't it be bad style to keep the database connection open at all time?

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

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

关于java - MySQL 和 Java : Insert efficiently as data comes in via events with high frequency,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14716735/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com