现在数据库有1000万数据,如何用java导出,并且不会内存溢出
时间: 2023-05-26 10:06:09 浏览: 538
java实现csv导出千万级数据实例
4星 · 用户满意度95%
可以使用分页查询的方式导出数据,即每次查询一定数量的数据,然后写入到文件中,直到导出全部数据。以下是一个示例代码:
```java
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DataExporter {
private static final int PAGE_SIZE = 1000; // 每页数据数量
private static final String FILE_PATH = "data.txt"; // 导出文件路径
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
BufferedWriter bw = null;
try {
// 连接数据库
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password");
// 准备导出数据的查询语句
String sql = "SELECT * FROM data LIMIT ?, ?";
ps = conn.prepareStatement(sql);
// 打开导出文件
bw = new BufferedWriter(new FileWriter(FILE_PATH));
// 导出数据
int start = 0;
boolean hasMore = true;
while (hasMore) {
ps.setInt(1, start);
ps.setInt(2, PAGE_SIZE);
rs = ps.executeQuery();
hasMore = false;
while (rs.next()) {
hasMore = true;
// 将数据写入文件
bw.write(rs.getString("id"));
bw.write("\t");
bw.write(rs.getString("name"));
bw.write("\n");
}
start += PAGE_SIZE;
}
System.out.println("导出完成!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭连接和文件
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
```
以上代码使用了分页查询的方式,每次查询一个固定数量的数据并将其写入到文件。这样做可以避免内存溢出。同时也可以使用流式获取数据的方式,通过设置一定的缓冲区大小,逐个获取数据并写入文件。这样做也可以避免内存溢出。
阅读全文