JAVA从数据库中获取ResultSet,将它们隔离在不同的文件中,将这些文件发送到不同的电子邮件ID



我遇到了一个问题。问题语句是同时启动多个线程。每个线程的职责都是从数据库中获取记录。每个记录都将具有groupID。这意味着如果我们得到100000条具有10个不同GroupID的记录。。。将创建10个文件,每个文件中有相应数量的记录。现在我们需要将这10个文件全部发送到10个不同的源。

如何在Springs中配置相同的。。?应该使用哪种设计模式。?如果你有什么例子,请告诉我。

我使用属性文件来提供SQL语句,它将返回Result集,然后将它们存储在临时文件中。这些文件是我通过电子邮件发送的。但我无法通过groupID和不同的邮件进行隔离。

您可以通过多种方式实现这一点。我建议你们两个:

1) 使用Spring Boot Batch Application,您可以轻松地处理记录的多线程批处理并将其写入文件。

2) 使用简单的执行器服务使它成为多线程的。

一些建议:

  • 不要在从DB读取的每个记录上写入文件。相反,使用由所有线程共享的同步Map<GroupId, List<Record>> map,并在使用上述映射基于GroupId进行分离时最终写入文件。

  • 如果希望根据任何参数对记录进行排序,请使用SortedList<Record>

  • 如果记录的数量很大,您可以在chuck中写入文件,例如,每次读取10000条记录时写入,然后清空映射并重新开始。

PS:这可能不是最好的方法,但这是我解决这个问题的方法。希望这能有所帮助。

感谢您的帮助和建议。我试着结合你的想法,以一种风险较小的方式。

我的问题是多个线程正在运行,这些线程从DB中获取数据并根据组ID填充文件。**来自DB的组ID也将在多个线程中可用,我还需要具有组ID数据的文件,但2个或多个线程的数据不应转储在1个文件中。所以我采取了以下方法。

抽象_DAO|五、Abstract_Handler|五、线程1_Handler_IMPL线程2_Handler_IMPL……

线程启动后,我将从JSON/properties文件中获得每个组ID的所有属性。地图在运行时使用此映射"PropClass"来获取writer/file/email/email_text/cc/file_temp_location。此外,对于每个线程,我将提供一个单独的临时位置,这样文件就不会相互引用。此映射是并发的,已在多个线程中使用。通过这种方式,我能够从一个拥有2000万客户的数据库中每天生成50万份报告。

如果我们能即兴使用这种方法,请告诉我。

如果我们分解问题,下面是我们想要执行的步骤。

  1. 从数据库中提取记录
  2. 按groupId对它们进行排序
  3. 在diff文件中转储具有不同groupId的记录
  4. 通过电子邮件将文件发送给一组人员

在这些#1&2可以通过主线程执行的SQL来完成。任务#3&4,可以通过为每个groupId生成一个工作线程来完成。您可以使用BlockingQueue来放置记录,这些记录将由工作线程使用。

如何在Springs中配置相同的。。?您可以使用Spring Batch Application。

应该使用哪种设计模式。?我建议,生产商/消费者设计模式。http://javarevisited.blogspot.in/2012/02/producer-consumer-design-pattern-with.html

最新更新