java - 如何从数据库中获取 300 万条记录并生成 CSV 文件
问题描述
我在数据库中有 300 万条记录。我想获取并创建多个 csv 文件。每个 csv 文件应该有 20 万条记录。如何以更快的方式实现这一要求?我们如何使用多线程来实现它?
解决方案
如果您想使用多个线程为您执行此操作,我会使用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)磁盘读取,这需要时间。
推荐阅读
- php - 基于 WooCommerce 中付款方式 ID 的其他电子邮件收件人
- reactjs - 如何在 Gatsby JS 中渲染 PDF?
- javascript - 如何在事件数据更改时重新呈现日历组件
- html - 如何在 Bootstrap 表格中设置表格单元格的宽度和高度
- c# - 如何在视图上模拟 bool/bit 数据?
- python - 运行 Python 函数 X 秒
- java - 有没有办法让这个接口有一个更多的默认实现?
- java - (Java) 输入验证未按预期工作?
- python - 解析未在 Python3 中注册 0 的数字字符串
- database - 在一个查询中获取结构和其他数据