背景
java 导出数据库数据,在数据量比较大的情况下,如果全部将数据读到内存中再执行写文件,很容易遇到内存溢出;为了避免内存溢出的问题,使用游标的方式,边读边写;
分页的方式,当数据量较大的情况下,需要花费一些建立数据库连接的消耗,而且存在事务的问题,比如导出第二页数据的时候,在第一页插入了内容,那么第二页就会导出重复的数据,也不是很推荐,所以可以尝试使用游标的方式;
数据准备
BEGIN
FOR i IN 1..2000000
LOOP
-- 插入数据SQL
INSERT INTO ......
--
IF
i MOD 10000 = 0 THEN
COMMIT;
END IF;
END LOOP;
END;
通过循环的方式插入200W数据,为了提高插入效率,1万条提交一次;
导出数据方法
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import java.io.*;
import java.sql.*;
import java.util.LinkedList;
import java.util.List;
@Slf4j
public class DataExportTest {
public static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
public static final String DRIVER = "oracle.jdbc.OracleDriver";
public static final String PASSWORD = "youdasi";
public static final String USERNAME = "youdasi";
@Test
public void exportTest() throws Exception {
//初始化数据库连接
Connection connection = initConnection();
Statement statement = connection.createStatement();
//FETCH_SIZE 的大小视具体情况而定
statement.setFetchSize(1000);
ResultSet resultSet = statement.executeQuery("SELECT * FROM TEST");
ResultSetMetaData metaData