如何快速向oracle插入大量数据,以及注意事项

本文介绍如何使用原生JDBC在Oracle数据库中批量插入千万条记录,并提供了一个完整的示例代码,包括数据库连接配置、批量插入操作及性能优化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先创建数据库,这里以oracle为例子,好像mysql差不多也是这样的

CREATE TABLE USSER2(

ID NUMBER(10,0) NOT NULL ENABLE,

NAME2 VARCHAR2(20 CHAR) NOT NULL ENABLE,

PASSWORD VARCHAR2(10 CHAR) NOT NULL ENABLE,

PRIMARY KEY (ID)
)

然后使用原生jdbc插入数据

package com.example.demo.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        final String url = "jdbc:oracle:thin:@localhost:1521:orcl";
        final String driverClassName = "oracle.jdbc.driver.OracleDriver";
        final String user = "ENTSUS_DC";
        final String password = "ideal";

        Class.forName(driverClassName);
        Connection conn = null;
        conn = DriverManager.getConnection(url, user, password);

        if (conn != null ) {
            System.out.println( "获取连接成功" );
            // 获取连接成功,调用插入方法
            insert(conn);
        } else {
            System.out.println( "获取连接失败" );
        }

    }

    /**
     * 实际执行插入数据的方法
     * @param conn
     */
    public static void insert(Connection conn) {

        try {
            // 设置事务的提交方式为手动提交
            conn.setAutoCommit(false);
            //获取当前的时间,看下总共用了多久时间添加完千万数据
            Date date = new Date();
            SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss");
            System.out.println(dateFormat.format(date));


            String sql = "INSERT INTO USSER2 ("
                    + "ID,"
                    +"NAME2,"
                    + "PASSWORD"
                    +")"
                    +"VALUES(?, ?, ?)";
            PreparedStatement pstm = conn.prepareStatement(sql);

            // 向数据库表table_name中批量插入1千万条数据
            for (int i = 1; i <= 10000000; i++) {
                pstm.setInt(1, i);  // 为第一个字段赋值(即:替换第一个问号的值)
                pstm.setString(2, "i");  // 为第二个字段赋值(即:替换第二个问号的值)
                pstm.setString(3, "男");  // 为第三个字段赋值(即:替换第三个问号的值)
                pstm.addBatch();   // 添加

                // 设置每5000条sql语句提交一次事务(说明,5000这个值不是固定的,根据实际情况来设置,值不同,插入的效率也不同,需经过测试才能获取最合适的值)
                if (i % 5000 == 0) {
                    pstm.executeBatch();   // 执行
                    pstm.clearBatch();     // 清空
                    conn.commit();         // 手动提交事务
                }
            }
            pstm.executeBatch();   // 执行
            pstm.clearBatch();     // 清空
            conn.commit();         // 手动提交事务

            // 调用释放资源的方法
            close(pstm, conn);

        } catch (SQLException e) {
            System.out.println("bbbbb");
            e.printStackTrace();
        }
    }

    /**
     * 释放资源的方法
     * @param pstm
     * @param conn
     */
    public static void close(PreparedStatement pstm, Connection conn) {
        try {
            if (pstm != null) {
                pstm.close();
            }
            if (conn != null) {
                conn.close();
            }
           //获取添加完数据,结束后的时间
            Date date = new Date();
            SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss");
            System.out.println(dateFormat.format(date));
            System.out.println("连接关闭,程序结束!");
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("连接关闭失败");
        }
    }

}

这样已经成功插入了,而且插入速度还是很快的,刷新数据库就行,速度:原生jdbc>jdbctemplate>存储过程>mybatis

注意事项:

ora-00904:标识符无效

1、表名写错了,仔细检查一下表。

2、字段名写错了,仔细检查一下表。

3、表中无该字段,仔细检查一下表。

4、字段包含了Oracle的关键字,把报错的字段用双引号括起来试试

5、或者你是用Navicat 来创建表的,默认是加了双引号,你可以直接复制我的,然后参照来改就行了,我已经去掉了双引号

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值