我在sqlserver中有900万条记录。我正在尝试将其导入 csv 文件,以便我可以将该数据放入 mongo db 中。我已经为 sql2csv 导入编写了 Java 代码。但我有两个问题
- 如果我读取列表中的所有数据,然后尝试插入到 CSV 中,则会出现内存不足异常。
- 如果我逐行读取并尝试将每一行插入 CSV 中,则导出数据需要很长时间。
我的代码是这样的
List list = new ArrayList();
try {
Class.forName(driver).newInstance();
conn = DriverManager.getConnection(url, databaseUserName, databasePassword);
stmt = conn.prepareStatement("select OptimisationId from SubReports");
result = null;
result = stmt.executeQuery();
// stmt.executeQuery("select * from Subscription_OptimisationReports");
result.setFetchSize(1000);
while (result.next()) {
//System.out.println("Inside while");
SubReportsBean bean = new SubReportsBean();
bean.setOptimisationId(result.getLong(("OptimisationId")));
list.add(bean);
generateExcel(list);
}
//generateExcel(list);
conn.close();
}
有没有一种更快的方法可以快速导出所有数据?或者如果可以直接导出到 mongo 而不是 csv 就更好了。
最佳答案
也许您应该使用 LIMIT 和 OFFSET 一次只读取一点数据来对数据进行分页。
select OptimisationId from SubReports OFFSET 0 ROWS FETCH NEXT 1000 ROWS ONLY;
select OptimisationId from SubReports OFFSET 1000 ROWS FETCH NEXT 1000 ROWS ONLY;
select OptimisationId from SubReports OFFSET 2000 ROWS FETCH NEXT 1000 ROWS ONLY;
...
只需保留偏移量的计数器即可。
如果您使用此解决方案,那么您需要修改代码以附加到 Excel 文件的末尾 - 不要将所有结果保留在内存中,否则您仍然会遇到 OutOfMemoryException。
关于java - 使用java从sqlserver将大数据导出到CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28767029/