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

时间:2017-10-23 18:05:37

标签: java email design-patterns resultset

我正在努力解决一个问题。问题陈述是同时启动多线程。每个线程的职责是从DB中获取记录。每条记录都有groupID。这意味着如果我们获得包含10个不同GroupID的100000条记录,那么将创建10个文件,每个文件中包含相应数量的记录。现在我们需要将所有这10个文件发送到10个不同的来源。

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

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

3 个答案:

答案 0 :(得分:0)

您可以通过多种方式完成此操作。我会建议你两个:

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

2)使用简单的Executor Service使其成为多线程。

一些建议:

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

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

  • 如果记录数量很大,你可以用chucks写入文件,例如每次读取10000条记录时写入,然后清空地图并重新开始。

    < / LI>

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

答案 1 :(得分:0)

HI Guyz感谢您的帮助和建议。我尝试将你的想法与风险较低的方式相结合。

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

Abstract_DAO     |     V Abstract_Handler     |     V Thread_1_Handler_IMPL Thread_2_Handler_IMPL ....

发布线程启动后,我将从JSON / Properties文件中获取每个组ID的所有属性。地图。使用此地图&#34; PropClass&#34;在运行时用于获取writer / file / email / email_text / cc / file_temp_location。此外,对于每个线程,我将提供一个单独的临时位置,以便文件不会相互引用。此映射是并发的,并且已在多个线程中使用。通过这种方式,我每天可以从2000万客户的数据库中生成500000个报告。

如果我们可以即兴发挥这种方法,请告诉我。

答案 2 :(得分:-1)

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

  1. 从数据库中提取记录。
  2. 按groupId排序。
  3. 转储差异文件中不同groupId的记录。
  4. 将文件通过电子邮件发送给一组人。
  5. 这些#1&amp; 2可以通过主线程执行的SQL来完成。 任务#3&amp; 4,可以通过为每个groupId生成一个工作线程来完成。 您可以使用BlockingQueue来放置将由工作线程使用的记录。

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

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