我正在对 MYSQL 表执行选择查询,该表有 16,213,156 行和 10 列。但是在建立连接后,代码只执行几分钟,然后抛出错误:线程“Thread-3”中的异常 java.lang.OutOfMemoryError:Java 堆空间
我的系统配置是 16 GB RAM,Java 8
我尝试将 Jvm 参数设置为 -Xms4G & -Xmx12G 。还尝试设置 stmt.setFetchSize(); // 到 10,100,1000 仍然是同样的错误
我们可以使用 JDBC API 获取如此大量的记录吗?我遗漏了什么吗?任何帮助将非常感激。
package com;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import com.opencsv.CSVWriter;
public class Test1 {
private static Connection conn = null;
public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException {
connection();
retrieve(conn);
}
public static void connection()
{
try
{
Class.forName("com.mysql.jdbc.Driver");
String url = "<jdbc connection url>";
conn = DriverManager.getConnection(url, "<username>", "<password>");
System.out.println("Connection established");
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void retrieve(Connection conn)
{
ResultSet rs = null;
Statement stmt = null;
try
{
stmt = conn.createStatement();
// stmt.setFetchSize(100); // 1000, 10
System.out.println(stmt.getFetchSize()); // By default prints 0
rs = stmt.executeQuery("SELECT * FROM tablename");
CSVWriter writer = new CSVWriter(new BufferedWriter(new FileWriter("C:\\finaldata\\test.csv")));
System.out.println("**** Started writing Data to CSV ****");
int lines = writer.writeAll(rs, true, false, false);
writer.flush();
writer.close();
System.out.println("** OpenCSV -Completed writing the resultSet at " + new Date() + " Number of lines written to the file " + lines);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
@MickMnemonic 感谢您的帮助,这解决了问题。
Setting 获取大小仅此一项可能不足以让 MySQL 驱动程序开始从数据库流式传输数据,而不是立即加载所有内容。你可以尝试用
stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY); stmt.setFetchSize(Integer.MIN_VALUE);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)