我想就我的问题征求一些建议。我有一个批处理,它执行一些计算(多线程环境),并在表中进行一些插入。我想做一些类似于批处理插入的操作,这意味着一旦我得到一个查询,等待有1000个查询,然后执行批插入(而不是一个接一个地执行)。
我想知道这上面是否有任何设计模式。我想到了一个解决方案,但有点复杂:
问题是:我该如何处理这个问题?我的意思是,最后999次查询,什么时候执行,因为我永远不会达到1000次?我该怎么办?
我在想,每5分钟醒来一次,并检查列表中的项目数。如果他醒来两次,数字相同,那么执行现有的查询。
有人有更好的主意吗?
发布于 2012-04-25 11:57:24
您的数据库驱动程序需要支持批量插入。看看这个。
您是否已经建立了您的系统因为服务和数据库之间的通信过多而被网络流量阻塞了?如果没有,我不会担心分批,直到你确定你需要它。
你在计划中提到你想每5分钟检查一次。那是永恒。如果你要在5分钟内得到1000件物品,你不应该需要批次。那是~3每秒。
假设您确实想批处理,那么每2秒就有一个进程醒来,并提交排队的任何内容。别等五分钟。它可能提交0行,也可能提交10...who cares...With这种方法,您不需要担心您的任意阈值没有达到。
我假设插入件是一次一个进来的。如果您的传入数据同时输入n,那么无论发生多少插入,我都会提交每个传入请求。如果您的消息是作为某种消息传递系统传入的,那么它无论如何都是异步的,因此您不需要担心批处理。在高负载下,传入的消息只需等到有能力处理它们。
发布于 2012-04-25 11:51:21
向该API中添加一个commit类型的方法,该方法将被调用以确认所有已添加的项。另外,最佳的批次尺寸在20-50之间.在此之后,越来越多的报表所需的簿记量超过了潜在的收益。您没有显式地提到它,但是当然您必须在JDBC中使用专用的批处理API。
如果您需要跟踪许多作者,每个作者都在自己的线程中,那么您还需要一个begin类型的方法,您可以计算它被调用了多少次,而不是commit被调用了多少次。就像推荐信一样。当您达到零时,您知道可以刷新语句缓冲区。
发布于 2012-04-25 12:40:35
这是最令人惊讶的概念,我已经面对了许多time.So,根据您的问题,您正在创建一个批处理,并且该批处理有1000个或更多的插入查询。但是,如果您要以重复的方式插入同一个表中。
为了避免这种情况,您可以使insert查询如下:-
插入table1值(‘4’,‘印度’),('5','Odisha'),('6',‘布巴内斯瓦尔’)
它只能使用多个values.So执行一次,更好的是,您可以将所有值保存在任何集合元素(arraylist、list等)中,并最终像上面这样进行查询并插入一次。
您还可以使用setTraction。(提交、回滚、setTraction() )等等。
希望,它会帮助你的。万事如意。
https://stackoverflow.com/questions/10314911
复制相似问题