我在sqlserver中有900万条记录。我试图将其导入csv文件,以便我可以将该数据放入mongo db。我已经为sql2csv import编写了Java代码。但我有两个问题
我的代码有点像
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。
答案 0 :(得分:1)
也许您应该通过使用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。
答案 1 :(得分:1)
当处理这么多记录时,在转储到CSV之前收集列表中的所有日期肯定会失败。
所以你的解决方案2就是你要走的路。
您的代码似乎与此解决方案相对应,但我认为您只是忘记移动列表声明或清空循环中的列表。你可以这样做:
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 list = new ArrayList();
list.add(bean);
generateExcel(list);
}
//generateExcel(list);
conn.close();
}