读取sql文件的插入语句并执行

java 测试用例如下

@SpringBootTest
public class BatchInsertTest {

    private static final String DB_URL = "jdbc:oracle:thin:@192.101.xxx.xxx:1521:orcl";
    private static final String USER = "xxx";
    private static final String PASS = "xxx";
    private static final int BATCH_SIZE = 2000;

    public static void main(String[] args) {
//        String filePath = "C:\\Users\\78643\\Desktop\\batchInsertTest.sql";
        String filePath = "C:\\Users\\78643\\UPC_202501270942.sql";
        List<String> sqlStatements = new ArrayList<>();

        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            StringBuilder sqlBuilder = new StringBuilder();
            boolean insideInsert = false; // 标记是否正在读取一个INSERT语句
            int i = 0; //执行次数
            Long a = System.currentTimeMillis();

            while ((line = br.readLine()) != null) {
                if (line.startsWith("INSERT")){
                    if (insideInsert){

                        // 如果已经开始读取一个INSERT语句,但现在遇到了一个新的INSERT关键字,
                        // 则意味着前一个INSERT语句已经结束(假设没有嵌套INSERT的情况)
                        sqlStatements.add(sqlBuilder.toString().trim().substring(0,sqlBuilder.length()-1));
                        sqlBuilder.setLength(0); // 清空StringBuilder以便下一个语句
                    }
                    insideInsert = true;
                }

                sqlBuilder.append(line);

                // 当列表大小达到BATCH_SIZE时,我们执行并提交这些语句
                if (sqlStatements.size() >= BATCH_SIZE) {
                    i = i + 1;
                    System.out.println("执行第"+(i)+"次");
                    executeBatch(sqlStatements);
                    sqlStatements.clear(); // 清空列表以便下一批处理
                }
            }

            // 提交最后一个INSERT语句(如果有的话)
            if (insideInsert && sqlBuilder.length() > 0) {
                sqlStatements.add(sqlBuilder.toString().trim().substring(0,sqlBuilder.length()-1));
            }

            // 提交最后一批(如果剩余的有)
            if (!sqlStatements.isEmpty()) {
                executeBatch(sqlStatements);
                i = i + 1;
                System.out.println("执行第"+(i)+"次");
            }
            Long b = System.currentTimeMillis();
            System.out.println("耗时:"+(b-a)+"ms");
        } catch (IOException | SQLException e) {
            e.printStackTrace();
        }
    }

    private static void executeBatch(List<String> sqlStatements) throws SQLException {
        try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS)) {
            conn.setAutoCommit(false); // 关闭自动提交

            for (String sql : sqlStatements) {
                try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
                    pstmt.executeUpdate();
                }
            }

            conn.commit(); // 提交事务
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值