从数据库读取数据并使用多线程写入文件

时间:2016-09-28 19:41:52

标签: java multithreading executorservice

我想开发一个程序,从数据库中读取数据并写入文件。 为了获得更好的性能,我想使用多线程。

我计划实施的解决方案基于以下假设:

  1. 没有必要从数据库中读取多个线程,因为DBMS需要管理并发问题(类似于写入文件)。鉴于数据库中的每个读取元素都将在同一事务中删除。
  2. 使用模型生产者 - 消费者:一个线程来读取数据(主程序)。和另一个在文件中写入数据的线程。
  3. 为了实现,我将使用执行器框架:一个线程池(size = 1)来表示消费者线程。
  4. 这些假设能否成为一个好的解决方案? 这个问题是否需要基于多线程的解决方案?

3 个答案:

答案 0 :(得分:2)

  

没有必要从数据库中读取多个线程,因为DBMS需要管理并发问题

确定。所以你想要一个从数据库中读取的线程。

  

这些假设能否成为一个好的解决方案?这个问题是否需要基于多线程的解决方案?

您的解决方案可行,但正如其他人所述,有关性能改进的问题(如果有的话)。线程程序的工作原理是因为您可以使用计算机上的多处理器(或核心)硬件。在您的情况下,如果线程被数据库阻止或被文件系统阻止,那么性能改进可能是最小的。如果你正在对数据进行大量处理,那么让多个线程处理任务就可以正常工作。

答案 1 :(得分:1)

这更像是一个评论:

首先假设:您应该在https://dba.stackexchange.com/上发布数据库部分。

返回一个简单的搜索: https://dba.stackexchange.com/questions/2918/about-single-threaded-versus-multithreaded-databases-performance - 因此您需要检查您的读取操作是否足够复杂,以及多线程是否满足您对数据库连接的需求。

此外,您的程序似乎是顺序读写。我不认为你甚至需要多线程,除非你想同时在同一个文件上多次写入。

答案 2 :(得分:1)

你应该看看Spring Batch,http://projects.spring.io/spring-batch/,它与JSR 352规范有关。

这个框架带有很好的模式来管理ETL相关的操作,包括多线程处理,数据分区等。