3

我想就我的问题寻求一些建议。我有一个批处理可以进行一些计算(多线程环境)并在表中进行一些插入。我想做一些像批量插入这样的事情,这意味着一旦我得到一个查询,等待有 1000 个查询,然后执行批量插入(不是一个一个地做)。

我想知道这是否有任何设计模式。我有一个解决方案,但它有点复杂:

  • 构建一个将接收查询的方法

  • 将它们添加到列表(字符串和/或语句)

  • 在列表有 1000 个项目之前不要执行

问题:我该如何处理结束?我的意思是,最后的 999 个查询,我什么时候执行它们,因为我永远不会达到 1000 ?我应该怎么办 ?

我正在考虑每 5 分钟唤醒一次并检查列表中项目数的线程。如果他醒来两次并且数字相同,则执行现有查询。

有没有人有更好的主意?

4

3 回答 3

2

您的数据库驱动程序需要支持批量插入。 看到这个。

您是否确定您的系统因服务和数据库之间的通信过多而阻塞网络流量?如果没有,我不会担心批处理,直到你确定你需要它。

你提到在你的计划中你想每 5 分钟检查一次。那是永恒。如果您要在 5 分钟内获得 1000 个项目,则不需要批处理。大约是每秒 3 次。

假设您确实想要批处理,让进程每 2 秒唤醒一次并提交排队的任何内容。不要等五分钟。它可能会提交 0 行,也可能会提交 10 行……谁在乎……使用这种方法,您不必担心没有达到您的任意阈值。

我假设插入物一次插入一个。如果您的传入数据一次进入 n ,我将提交每个传入请求,无论发生多少插入。如果您的消息以某种消息传递系统的形式传入,那么无论如何它都是异步的,因此您不必担心批处理。在高负载下,传入的消息只是等到有能力处理它们。

于 2012-04-25T11:57:24.950 回答
0

向该 API添加commit一种方法,该方法将被调用以确认已添加所有项目。此外,最佳批量大小在 20-50 范围内。在那之后,潜在的收益被越来越多的报表所必需的簿记所抵消。您没有明确提及它,但是您当然必须使用 JDBC 中的专用批处理 API。

如果您需要跟踪许多作者,每个作者都在自己的线程中,那么您还需要begin一种方法,并且您可以计算它被调用的次数,与被调用的次数相比commit。类似引用计数的东西。当你达到零时,你知道你可以刷新你的语句缓冲区。

于 2012-04-25T11:51:21.563 回答
0

这是最令人惊奇的概念,我遇到过很多次。因此,根据您的问题,您正在创建一个批次,并且该批次有 1000 个或更多的 insert 查询。但是,如果您以重复的方式插入到同一个表中。

为了避免这种情况,您可以像这样进行插入查询:-

INSERT INTO table1 VALUES('4','India'),('5','Odisha'),('6','Bhubaneswar')

它只能使用多个值执行一次。因此,最好将所有值保留在任何集合元素(arraylist、list 等)中,最后像上面一样进行查询并插入一次。

您也可以使用 SQL Transaction API.(Commit,rollback,setTraction()) 等。

希望,它会帮助你。一切顺利。

于 2012-04-25T12:40:35.837 回答