首页 > 解决方案 > 如何从数据库中获取 300 万条记录并生成 CSV 文件

问题描述

我在数据库中有 300 万条记录。我想获取并创建多个 csv 文件。每个 csv 文件应该有 20 万条记录。如何以更快的方式实现这一要求?我们如何使用多线程来实现它?

标签: javamultithreading

解决方案


如果您想使用多个线程为您执行此操作,我会使用OFFSET多个查询(准确地说是 15 个(3M/200K))。

第一个问题是创建查询。这将是一种方式:

int offset = 0;
int incrementer = 200000; // 200k
String baseQuery = "SELECT ... FROM ... WHERE ... LIMIT 200000 OFFSET "; // OFFSET must be supported by your DB for this to work.

ArrayList<String> queries = new ArrayList<>();

int queryCount = 3000000 / incrementer;

for (int i = 0; i < queryCount; i++) 
{
    String tmpQuery = baseQuery + offset;
    offset += incrementer;
    
    queries.add(tmpQuery);
}

现在我们得到了我们的查询。我们应该为他们每个人创建一个线程,他们将在其中获取数据并创建您的 CSV 文件。

for (String query : queries)
{
    Runnable runnable = () ->
    {
        // Use preparedStatement to create the query
        // Fetch the data
        // Write them to cv file
        
        // use query variable!
    };
    
    Thread thread = new Thread(runnable);
    thread.start();

}

尽管如此,不要期望性能会因此而提高,所有线程都从同一个(DB)磁盘读取,这需要时间。


推荐阅读