我想就我的问题寻求一些建议。 我有一个批处理进行一些计算(多线程环境)并在表中进行一些插入。 我想做一些类似批量插入的事情,这意味着一旦我得到一个查询,例如等待有 1000 个查询,然后执行批量插入(而不是一个一个地执行)。
我想知道这是否有任何设计模式。 我有一个解决方案,但它有点复杂:
构建一个接收查询的方法
将它们添加到列表(字符串和/或语句)
直到列表有 1000 项才执行
问题:我该如何处理结尾? 我的意思是,最后 999 个查询,我什么时候执行它们,因为我永远不会达到 1000 个? 我应该怎么办 ?
我正在考虑一个线程,该线程每 5 分钟唤醒一次并检查列表中的项目数。如果他醒来两次并且次数相同,则执行已有的查询。
有没有人有更好的主意?
最佳答案
您的数据库驱动程序需要支持批量插入。 See this.
您是否确定您的系统因服务和数据库之间的通信过多而阻塞网络流量?如果没有,我不会担心批处理,直到你确定你需要它。
您在计划中提到您希望每 5 分钟检查一次。那是永恒。如果您要在 5 分钟内获得 1000 件元素,则不需要批处理。那是每秒 3 次。
假设您确实想要批处理,让一个进程每 2 秒唤醒一次并提交排队的任何内容。不要等五分钟。它可能会提交 0 行,可能会提交 10 行……谁在乎呢……使用这种方法,您无需担心未达到任意阈值。
我假设一次插入一个。如果您的传入数据一次进入 n,我将只提交每个传入请求,无论发生多少次插入。如果您的消息作为某种消息传递系统传入,那么它无论如何都是异步的,因此您不必担心批处理。在高负载下,传入的消息只是等待,直到有能力处理它们。
关于java jdbc 设计模式 : handle many inserts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10314911/