JDBC批量插入

2023-05-16

最近项目中有用到JDBC技术,存在大量数据要进行插入,通过研究采用批量插入速度快的不是一点点。下面简单比较了一下普通插入与批量插入5W条数据的时间效率。

常规插入:耗时12952ms

public static void normalInsert() throws SQLException {
    long start = System.currentTimeMillis();
    Connection conn = getConnection();
    PreparedStatement ps = null;
    for (int i=0;i < 50000;i++){
        String sql = "insert into xxx values (?,'1','1')";
        ps = conn.prepareStatement(sql);
        ps.setString(1, i+"");
        ps.execute();
        ps.close();
    }
    long end = System.currentTimeMillis();
    System.out.println(end - start);
}

批量插入:耗时930ms

public static void batchInsert() throws SQLException {
    long start = System.currentTimeMillis();
    Connection conn = getConnection();
    conn.setAutoCommit(false);
    PreparedStatement ps = null;
    String sql = "insert into xxx values (?,'1','1')";
    ps = conn.prepareStatement(sql); // 批量插入时ps对象必须放到for循环外面
    for (int i=0;i < 50000;i++){
        ps.setString(1, i+"");
        ps.addBatch();
        // 每1000条记录插入一次
        if (i % 1000 == 0){
            ps.executeBatch();
            conn.commit();
            ps.clearBatch();
        }
    }
    // 剩余数量不足1000
    ps.executeBatch();
    conn.commit();
    ps.clearBatch();
    long end = System.currentTimeMillis();
    System.out.println(end - start);
}

显而易见,这还是表结构简单,插入数据就相差十倍多。

oracle插入150W耗时3分钟;删除52秒。
truncate清空表,速度超快;delete删除比较慢,可以加条件;删除150w数据truncate只要2秒,而delete可能要差不多1分钟
truncate table xxx;    delete from xxx;

常见SQL错误:

1)Oracle数据库中打开的游标最大数为一定值,默认情况下是300,当代码到第二步时,循环中一个PreparedStatement占用了一个数据库游标,执行的循环超过这个数时就会产生游标数目溢出错误。
解决办法:每次执行完PreparedStatement,都将PreparedStatement.close()下,释放掉这个资源就好了
Exception in thread "main" java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误
ORA-01000: 超出打开游标的最大数
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-01000: 超出打开游标的最大数

ORA-01000: 超出打开游标的最大数

2)java.sql.SQLException:ORA-00054;资源正忙,但指定以NOWAIT方式获取资源,或者超时失败
原因:数据库中存在未提交的记录

3)java.sql.SQLException 索引中丢失in或out参数
原因:SQL语句有问题
解决:jdbc进行字段拼接插入操作时,为string类型的加上单引号
          另外,用prepareStatement.setString(1, 字段值),可以防止字段值有单引号而破坏sql问题

4)java.sql.BathUpdateException:ORA-01461;仅能绑定要插入LONG列的LONG值
原因:由于要插入的字段长度超出了数据库中表定义的字段长度
--------------------------补充-----------------------------------
varchar2是Oracle提供的特定数据类型
varchar2(10)一般情况最多存5个汉字,10个字符。具体要看数据库使用的字符集:GBK(汉字2字节;英文1个;Oracle安装默认GBK编码格式);UTF-8(汉字3字节,英文1个)
一般页面做输入字符串长度校验时,以数据库设计字段最大长度/3作为最大长度
nvarchar(10)可以存10个汉字,10个字符
当长度大于4000的时候就应该用CLOB,因为oracle的varchar2最多4000个字符

5)ORA-24816:在实际的LONG或LOB列之后提供了扩展的非LONG绑定数据
原因:这个问题很奇怪,就算没有LONG类型的数据,全部都是VARCHAR2和CLOB在操作数据库更新的时候一直报这个错误
解决:歪打正着,调整了一下各种更新字段位置,将放在前面的CLOB类型放在后面,就不报错了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDBC批量插入 的相关文章

  • ResultSet.getTimestamp("日期") 与 ResultSet.getTimestamp("日期", Calendar.getInstance(tz))

    java util Date java util Timetamp似乎给许多人带来了极大的困惑 StackOverflow 中有很多问题 不幸的是我的问题有点扭曲 有 2 个 JDBC api 他们应该如何表现 RDBMS 之间是否存在一致
  • JDBC/数据库单元测试的最佳实践[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有与多个数据库 如 Sybase Postgress DB2 等 通信的代码 因此 我有不同的模块 对每个数据库都有不同的查询 我开始使用 H
  • 如何获取hive中的数据库用户名和密码

    正在编写jdbc程序来连接hive数据库 我希望在连接 url 中提供用户名和密码 我不知道如何使用 hive QL 获取用户名和密码 有人可以帮我吗 Exception in thread main java sql SQLNonTran
  • PreparedStatement缓存——它是什么意思(它是如何工作的)

    例如 我使用 c3p0 和一些定义的 maxStatements 来进行准备语句缓存 这个缓存到底有什么作用 它缓存什么样的数据 在什么级别 数据库 应用程序 从例子中理解它会很好 例如我有一个查询 从某个表中选择 其中某个列 现在我在未缓
  • 从 JDBC 结果集中获取 XML 的最佳方法

    我正在寻找从 JDBC 结果集中获取 XML 文档的最佳方法 XML 的结构并不是非常重要 但它应该相当快 为了清楚起见 我想要结果集中的数据和足够的元数据来识别数据 本质上是字段名称 我目前正在使用 MySQL DB2 SQL Serve
  • 使用 H2 数据库在 JDBC 中将年份从负 -509 更改为正 510

    509 vs 510 我在使用 JDBC 时看到某种已更改或错误的数据 所以我观察使用H2数据库 http h2database com Java 8 更新 151 上的版本 1 4 196 这是一个完整的例子 请注意我们如何检索日期值三次
  • JDBC SQL 客户端工具推荐[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有人可以推荐一个好的 开源的 独立的开发工具来使用 JDBC 查询 SQL 数据库并将结果导出到文件吗 我知道许多数据库供应商都提供了他们
  • 用于 SQL 更新语句的 Java 单工作线程

    我正在开发一个基于 Java 的服务器 其中有多个线程 每个连接的用户一个线程 一些额外的线程 会涉及到一些数据库连接 所以我在想服务器每次创建一个SELECT查询数据库时 它将为此启动一个新线程 以防止当前线程阻塞 我计划为此使用连接池
  • Java 大型数据库插入

    我有一个数据库 需要在其中插入批量数据 一次大约 500k 条记录 我正在使用 derby 进行测试 发现这么多记录的插入时间约为 10 15 分钟 我正在用 Java 进行批量插入 这次看起来是否很慢 在普通笔记本电脑上工作 有没有办法加
  • 如何使用 JDBC 进行扩展插入而不构建字符串?

    我有一个应用程序可以解析日志文件并将大量数据插入数据库 它是用 Java 编写的 并通过 JDBC 与 MySQL 数据库通信 我尝试了不同的插入数据的方法 以找到适合我的特定用例的最快方法 目前看来表现最好的方法是发出扩展插入 例如 具有
  • android sqlite 一次读取所有行

    有没有办法读取 sqlite 表中的所有行并在文本视图中立即显示它们 这就是我阅读它们的方式 它逐行阅读 retrieves all the titles public Cursor getAllTitles return db query
  • 从 MySql 迁移:MariaDB 服务器意外关闭客户端连接

    由于许可 商业使用原因 我们正在从 MySql 迁移到 MariaDB 我们已经成功用 MariaDB 客户端 jar 替换了 MySql 连接器 jar 第一次更改 现在正在尝试用 MariaDB 服务器替换 MySql 服务器而不更改数
  • 在 JDBC PL/SQL 块中多次使用命名参数时出错

    当使用命名参数调用 PL SQL 块时出现错误 当所有命名参数仅使用一次时 我的代码工作正常 但是当我复制标有 SQL 的 SQL 时 然后所有命名参数 以冒号开头 q 都使用了两次 现在我得到一个 SQL 异常 它说 参数名称的数量与注册
  • 获取 Oracle JDBC 连接上的 MySQL 错误堆栈跟踪

    我在使用连接字符串进行 Oracle JDBC 连接时遇到非常奇怪的错误 我将用户名指定为 sys 应该是 sys as sysdba 理想情况下 它应该来自 ojdbc6 jar 但就我而言 它来自 mysql connector jav
  • 如何在 mysql 或 JDBC 的表中自动插入外键引用?

    我正在使用MySQL 我的问题是如何自动将新添加的行插入外键表中 一个例子可以澄清我的问题 我有两个表 员工 和 薪水 CREATE TABLE Employee emp id int NOT NULL AUTO INCREMENT nam
  • java.sql.SQLException:在结果集开始之前[重复]

    这个问题在这里已经有答案了 我已尝试使用以下代码来检索存储在数据库中的图像 我创建了一个名为image db包含一个名为的表image details 该表有两个字段 id and image path两者都是类型mediumblob 我在
  • Spring:如何使用 GenericDao 获取多个数据源?

    我有一个使用 Spring 3 1 1 的网络应用程序 我们有一个使用 JdbcTemplate 的 genericDao 数据源在 GenericDaoImpl 中像这样注入 public class GenericDaoImpl
  • 获取jdbc中表依赖顺序

    我在 MySQL 数据库中有一组表 A B C D 依赖关系如下 B gt C gt A 和 D gt A 也就是说 A 有一个 PrimaryKey C 有一个外键指向 A 的主键 B 有一个外键指向 C 的主键 类似地 D 有一个外键指
  • Kafka JDBC Sink Connector 对于具有可选字段的模式的消息给出空指针异常

    Kafka JDBC Sink Connector 对于具有可选字段 parentId 的模式的消息给出空指针异常 我错过了什么吗 我正在使用开箱即用的 JSONConverter 和 JDBC Sink Connector 关于 Kafk
  • 如何使用 WHERE x IN 子句编写PreparedStatement 的SQL?

    我有一个如下所示的查询 SELECT last name first name middle initial FROM names WHERE last name IN smith jones brown 我需要能够对 IN 子句中的列表进

随机推荐

  • 完美解决Windows本地python与Anaconda的python共存

    完美解决Windows本地python与Anaconda的python共存 xff1a 项目相关背景 xff1a 项目背景 xff1a 用了很久的本地python环境 xff0c 但是最近因为项目需要频繁切换各种深度学习框架且需求是GPU平
  • OpenCV 目标跟踪debug日志-Expected Ptr<cv::legacy::Tracker> for argument ‘newTracker‘

    error OpenCV 4 5 4 1 error 5 Bad argument in function add Expected Ptr xff1c cv legacy Tracker xff1e for argument newTra
  • 【NoMachine 如何Ctrl + Alt + T启动Linux终端】

    NoMachine 无法使用Ctrl 43 Alt 43 T打开Linux终端 问题原因解决方法 问题原因 NoMachine软件的快捷键与Linux系统启动终端快捷键冲突 解决方法 1 打开 NoMachine主界面 xff0c 找到Se
  • intent.getStringExtra 获取的数据是之前的数据

    多次使用同一个PendingIntent 发送广播时 xff0c 可能会出现Intent对象被重用的情况 xff0c 导致获取到的数据不正确 要解决这个问题 xff0c 可以在创建PendingIntent 时 xff0c 使用Pendin
  • insert语句中sequence的使用方法

    我们常常在表中需要插入一些自动增长的值 一方面 我们可以手动添加这些值 xff0c 另一方面 oracle提供的sequence可以帮助我们实现插入的值自动增长 而不需要我们手动的提供值 我们需要做的就是设置好sequence的初值和增长值
  • ubuntu20-mate系统树莓派4B不连接显示器无法启动的问题

    官方更新了ubuntu20 mate xff0c 下载地址 xff1a https ubuntu mate org download armhf 于是我就给树莓派4B装上了 xff0c 配置好了vnc 发现不连接显示器树莓派就无法启动 xf
  • qt如何获取qwebengine在“应用程序输出”中输出的内容

    在webengineview中点击超链接后会在qt creator的 应用程序输出 栏中输出超链接内容 xff0c 如何获取这些输出的显示内容呢 xff1f xff08 既然在控制台中输出了 那么web中的信息一定传到qt了 xff0c 如
  • 判断单链表中是否存在回环

    判断单链表是否存在回环原理很简单 xff0c 即假设有两个指针p1 xff0c p2 在每次循环的时候 xff0c p1先走一步 xff0c p2走两步 xff0c 直到p2碰到空指针或两者相等时循环结束 xff0c 如果两个指针相等则说明
  • linux yum安装卸载jdk8

    1 gt 安装 1 yum y list java 列出jdk列表 2 yum install y java 1 8 0 openjdk demo x86 64 xff08 安装这个java version 正常显示 xff0c 但是jav
  • 使用Document解析xml

    1 引入maven jar包 lt dependency gt lt groupId gt dom4j lt groupId gt lt artifactId gt dom4j lt artifactId gt lt version gt
  • 【math】 向量运算:叉乘

    文章目录 1 定义2 几何意义3 拓展应用 1 定义 c 61 a b 向量的叉乘 xff0c 即求同时垂直两个向量的向量 xff0c 即c垂直于a xff0c 且c垂直于b 假设向量a 61 a x a y a z b 61 b x b
  • 基于Mahout的电影推荐网站的设计与实现(JAVA语言实现)

    1 概要 本系统是一个以Mysql为数据库 xff0c 利用Java servlet开发的基于B S结构的电影推荐网站 服务器是Apache Tomcat xff0c 推荐库是Apache Mahout xff0c 在Eclipse环境下进
  • Java与设备(PLC)通信

    通信名词 上位机 指可以直接发出操控命令的计算机 xff0c 一般是PC host computer master computer upper computer 控制者和提供服务者是上位机 xff1b 工控机 工作站 触摸屏可作为上位机
  • DAMA学习笔记

    第1章 数据管理 1 1 引言 1 数据管理 xff1a 为了实现数据价值 xff0c 制定计划 制度并执行 监督 2 数据管理专业人员 xff1a 技术人员 xff08 数据库管理员 网络管理员 程序员 xff09 和业务人员 xff08
  • 2023 学习日志

    2023 01 03 mybatis源码学习 学习视频 xff1a https www bilibili com video BV1Tp4y1X7FM p 61 1 amp vd source 61 cc82a52a9b9b8b31eca3
  • oracle create view语法

    视图实际上是一个或多个表上的预定义查询 xff0c 这些表称为基表 视图并不存储数据 xff0c 只是在查询视图时才访问基表 视图的优点 xff1a 限制用户只能通过视图检索数据 xff0c 对用户屏蔽基表 可以将复杂的查询编写为视图 xf
  • EL表达式两个foreach嵌套循环

    集合List中加List泛型的泛型 List lt RiskEvaSuitQuestion gt riskEvaSuitQuestionList 61 riskEvaSuitQuestionService getQueList 100003
  • JQuery通过radio,select改变隐藏显示div

    1 xff09 select下拉框控制div的隐藏与显示 lt script gt function checkYear var selectValue 61 34 select name 61 39 periodType 39 34 va
  • 开科唯识笔试

    对于这次的笔试 xff0c 我只想说BiShi 几道编程题加一道SQL题 1 找出所有三位数中的水仙花数 public void getNarcissusNums int g 61 0 s 61 0 b 61 0 sum 61 0 for
  • JDBC批量插入

    最近项目中有用到JDBC技术 xff0c 存在大量数据要进行插入 xff0c 通过研究采用批量插入速度快的不是一点点 下面简单比较了一下普通插入与批量插入5W条数据的时间效率 常规插入 xff1a 耗时12952ms public stat