JAVA 从数据库中获取结果集,将它们隔离在不同的文件中,将这些文件发送到不同的电子邮件 ID
JAVA obtain ResultSet from DB, segregate them in different files, send these files to different email ID's
我正在努力解决一个问题。问题陈述是同时启动多个线程。每个线程的职责是从数据库中获取记录。每条记录都会有 groupID。这意味着如果我们得到 100000 条记录,其中包含 10 个不同的 GroupID...将创建 10 个文件,每个文件中都有相应的记录数。现在我们需要将所有这 10 个文件发送到 10 个不同的源。
如何在 Springs 中配置相同的..?应该使用哪种设计模式。?如果您有任何示例,请告诉我。
我正在使用属性文件提供 SQL 语句,这将 return 结果集,然后将它们存储在临时文件中。我通过电子邮件发送这些文件。但我无法通过 groupID 和不同的邮件进行隔离。
您可以通过多种方式完成此操作。我会建议你两个 :
1) 使用Spring Boot Batch Application,您可以轻松处理记录的多线程批处理并将其写入文件。
2) 使用简单的执行器服务使其成为多线程。
一些建议:
不要在从数据库读取的每条记录上写入文件。而是使用由所有线程共享的同步 Map<GroupId, List<Record>> map
,并在使用上述映射基于 GroupId 完成隔离时最后写入文件。
如果您希望根据任何参数对记录进行排序,请使用 SortedList<Record>
。
如果记录数很大,可以分块写入文件,比如每次读取10000条记录后写入,然后清空map重新开始。
PS :这可能不是最好的方法,但这是我为解决这个问题陈述所做的。希望这有帮助。
如果我们分解问题,下面是我们要执行的步骤。
- 从数据库中提取记录。
- 按 groupId 排序。
- 将groupId不同的记录转储到diff文件中。
- 将文件通过电子邮件发送给一组人。
其中 #1 和 2 可以由 SQL 由主线程执行来完成。
任务#3 和 4,可以通过为每个 groupId 生成一个工作线程来完成。
可以使用BlockingQueue来放记录,这些记录会被worker线程消费。
如何在 Springs.. 中配置相同的内容?
您可以使用 Spring 批量申请。
应该使用哪种设计模式。?
我建议,Producer/Consumer 设计模式。
http://javarevisited.blogspot.in/2012/02/producer-consumer-design-pattern-with.html
HI Guyz 感谢您的帮助和建议。我尝试以一种风险较小的方式结合您的想法。
我的问题是多个线程 运行 从数据库中获取数据并根据组 ID 填充文件。 ** 来自数据库的组 ID 也将在多个线程中可用,我还需要包含组 ID 数据的文件,但不应将 2 个或更多线程数据转储到 1 个文件中。所以我遵循了以下方法。
Abstract_DAO
|
V
Abstract_Handler
|
V
Thread_1_Handler_IMPL
Thread_2_Handler_IMPL
....
Post 线程启动,我将从 JSON / Properties 文件中获取每个组 ID 的所有属性。地图 。在运行时使用此映射 "PropClass" 来获取 writer/file/email/email_text/cc/file_temp_location。此外,对于每个线程,我将提供一个单独的临时位置,以便文件不会相互引用。该映射是并发的,并在多个线程中使用。通过这种方式,我每天可以从包含 2000 万客户的数据库中生成 500000 份报告。
如果我们可以改进这种方法,请告诉我。
我正在努力解决一个问题。问题陈述是同时启动多个线程。每个线程的职责是从数据库中获取记录。每条记录都会有 groupID。这意味着如果我们得到 100000 条记录,其中包含 10 个不同的 GroupID...将创建 10 个文件,每个文件中都有相应的记录数。现在我们需要将所有这 10 个文件发送到 10 个不同的源。
如何在 Springs 中配置相同的..?应该使用哪种设计模式。?如果您有任何示例,请告诉我。
我正在使用属性文件提供 SQL 语句,这将 return 结果集,然后将它们存储在临时文件中。我通过电子邮件发送这些文件。但我无法通过 groupID 和不同的邮件进行隔离。
您可以通过多种方式完成此操作。我会建议你两个 :
1) 使用Spring Boot Batch Application,您可以轻松处理记录的多线程批处理并将其写入文件。
2) 使用简单的执行器服务使其成为多线程。
一些建议:
不要在从数据库读取的每条记录上写入文件。而是使用由所有线程共享的同步
Map<GroupId, List<Record>> map
,并在使用上述映射基于 GroupId 完成隔离时最后写入文件。如果您希望根据任何参数对记录进行排序,请使用
SortedList<Record>
。如果记录数很大,可以分块写入文件,比如每次读取10000条记录后写入,然后清空map重新开始。
PS :这可能不是最好的方法,但这是我为解决这个问题陈述所做的。希望这有帮助。
如果我们分解问题,下面是我们要执行的步骤。
- 从数据库中提取记录。
- 按 groupId 排序。
- 将groupId不同的记录转储到diff文件中。
- 将文件通过电子邮件发送给一组人。
其中 #1 和 2 可以由 SQL 由主线程执行来完成。 任务#3 和 4,可以通过为每个 groupId 生成一个工作线程来完成。 可以使用BlockingQueue来放记录,这些记录会被worker线程消费。
如何在 Springs.. 中配置相同的内容? 您可以使用 Spring 批量申请。
应该使用哪种设计模式。? 我建议,Producer/Consumer 设计模式。 http://javarevisited.blogspot.in/2012/02/producer-consumer-design-pattern-with.html
HI Guyz 感谢您的帮助和建议。我尝试以一种风险较小的方式结合您的想法。
我的问题是多个线程 运行 从数据库中获取数据并根据组 ID 填充文件。 ** 来自数据库的组 ID 也将在多个线程中可用,我还需要包含组 ID 数据的文件,但不应将 2 个或更多线程数据转储到 1 个文件中。所以我遵循了以下方法。
Abstract_DAO | V Abstract_Handler | V Thread_1_Handler_IMPL Thread_2_Handler_IMPL ....
Post 线程启动,我将从 JSON / Properties 文件中获取每个组 ID 的所有属性。地图 。在运行时使用此映射 "PropClass" 来获取 writer/file/email/email_text/cc/file_temp_location。此外,对于每个线程,我将提供一个单独的临时位置,以便文件不会相互引用。该映射是并发的,并在多个线程中使用。通过这种方式,我每天可以从包含 2000 万客户的数据库中生成 500000 份报告。
如果我们可以改进这种方法,请告诉我。