最近有个需求是需要在java 后端执行导入,数据量比较大, 需要对数据进行很多操作,最后要执行插入数据操作, 一开始先组织好插入数据的sql语句放在数组中,使用的是 jdbcTemplate.batchUpdate()方法,后来发现当数据比较多 ,成千上万条时,他的插入效率比较慢,所以又改用了jdbc 的批量插入.插入速度有了很大的提速

方法1

直接使用了jdbctemplate内部封装的batchUpdate方法,他的底层也是用了 jdbc 的批量执行,但是执行效率要比 正常使用jdbc 批量执行要慢很多,插入2600条数据的20个字段左右的表用时40s 左右,

// sqls 为组织好的插入数据的sql数组,
//{"insert into user(id,name,pwd) values('1','a','123456')","insert into user(id,name,pwd) values('2','b','123456')",...   }
// j
public void insertData(String[] sqls,JdbcTemplate jdbctemplate){jdbctemplate.batchUpdate(sqls);
}

方法2

使用了 jdbc 的批量执行sql, 主要使用了addBatch(),executeBatch(),clearBatch()方法,
这样批量执行 大大的提高了执行效率,2600条数据 20个字段的表插入只用了4-5s,
下面方法控制每5000条sql执行一次,剩下不足500条最后再执行一次.

public void insertData2(String[] sqls,JdbcTemplate jdbctemplate){Connection conn = jdbcTemplate.getDataSource().getConnenction();conn.setAutoCommit(false);//设置连接对象的自动提交为falseStatement statement = conn.createStatement();for(int i=0;i<sqls.length;i++){statement.addBatch(sqls[i]);if(i % 5000 ==0){statement.executeBatch(); // 批量执行conn.commit();  // 手动提交statement.clearBatch();  // 清楚之前批量执行的}}statement.executeBatch();conn.commit();statement.clearBatch();
}

注意:

  1. 数据库区别:

本项目用的是 oracle数据库, 而mysql服务器默认是关闭批处理的,我们需要通过一个参数,让mysql开启批处理的支持。 ?rewriteBatchedStatements=true 写在配置文件的url后面
本问题参考自
作者:Nemo
链接:https://www.cnblogs.com/blknemo/
来源:博客园

  1. 可能出现的sql错误(本项目未遇到)
  • 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: 超出打开游标的最大数

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

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

  • 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个字符

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

可能发生的sql报错信息 转自CSDN博主「thankjj20160909」的原创文章
原文链接:https://blog.csdn.net/qq_36092584/article/details/80721904

jdbc 批量执行sql相关推荐

  1. PreparedStatement批量执行sql

    2019独角兽企业重金招聘Python工程师标准>>> 案例: 工具方法: public static Connection getConnection(){try {Class.f ...

  2. java 批量执行 sql_JDBC批量执行SQL

    批量执行SQL,效率比较高,但执行SQL太多,谨防内存溢出. 代码案例一: package com.what21.jdbc.demo05; import java.sql.Connection; im ...

  3. hive 批量执行sql脚本文件 跳过异常语句

    应用场景 hive执行sql的方式很多,在需要批量执行sql的场景下就需要使用到hive 命令 或beeline命令. 使用方式 hive -f a.sql 这个命令会执行a.sql里面的sql命令, ...

  4. 金蝶EAS客户端批量执行sql代码

    //客户端批量执行sql SqlExcFacadeFactory.getRemoteInstance().executeBatch(new String[]{sql});

  5. 如何用sqlplus执行一个sql文件和批量执行sql文件

    1.sqlplus执行单个SQL文件 举个例子,假设你的sql文件是test.sql ,保存路径是D:\script,那么在sqlplus里执行它,用如下语法: sqlplus> @D:\scr ...

  6. orientDB批量执行SQL

    前言: 关于orientDB的中文资源还是太少,几经周折才找到如何批量执行orientDB SQL脚本,下面是我整理的批量执行SQL的办法,可供初学者参考. 开门见山: 我们在初学orientDB时, ...

  7. JAVA使用JDBC批量插入SQL

    数据库连接使用proxool连接JDBC 代码 JAVA类 package com.czr.proxool;import org.logicalcobwebs.proxool.ProxoolExcep ...

  8. sqlplus中批量执行sql脚本(Oracle)

    假如我们有很多sql脚本,如果一个一个sql脚本文件执行显然过于麻烦,下边我们演示sql脚本批量执行. 解决方法:将需要执行的sql脚本文件的@绝对路径 存放到一个脚本文件中,然后执行这个脚本文件就可 ...

  9. linux下db2创建批量存储过程,DB2批量执行SQL脚本以及存储过程的实现

    使用过的命令: 进入db2cmd db2 connect todb_aliasuserusernameusingpassword db2 -tvfc:\abc.sql-labc.log 参考如下: 可 ...

最新文章

  1. WINKEY功能键你会用吗??
  2. APP和网站应该选择云主机还是服务器呢?
  3. STM32 基础系列教程 44 - FSMC_LCD
  4. Nmap扫描参数解析(转)
  5. mysql数据库集群架构图_搭建MySQL-Cluster集群架构
  6. php xml 接口调用,php的SimpleXML方法读写XML接口文件实例解析
  7. 在debug模式下引入一些性能检测工具
  8. 【Luogu1908】逆序对(离散化,树状数组求逆序对)
  9. MSExchangeIS ID8528 日志提示邮箱已满报警
  10. 黑群晖 DSM 6.2 3617 成功安装教程
  11. SPSS的中分层聚类法的实际应用详解
  12. echarts南丁格尔玫瑰图
  13. C++[Error] expected primary-expression before ‘]‘ token
  14. AD fanout 各选项说明
  15. 服务器安装torchvision库文件时报错EnvironmentError: [Errno 28] No space left on device的完美解决方法及思维过程
  16. Day 1: 音标学习
  17. 微信发展简史:微信成功的必然和偶然
  18. java web 流媒体播放_实时流(直播流)播放、上墙(大屏播放)解决方案
  19. 基于AntDesign UI的自定义表单
  20. 自媒体行业的5个新变化,跟上新变现,赚钱其实也不难

热门文章

  1. 配置服务器的dns文件是什么意思,什么是服务器配置,DNS服务器如何配置
  2. Jtapi开发之转接二 传递uui
  3. 咽炎引发-----喉源性咳嗽(摘)
  4. Windows环境导入导出Oracle的DMP包文件
  5. pdfbox2.0.1将pdf转图片
  6. 物理内存占用多少正常
  7. Java基础 实验四 抽象类和接口
  8. 让手机支持OTG,不看绝对后悔! - 我也做一回搬运工,解决RFID读卡器OTG支持问题
  9. 血泪总结:如何从微信小程序的坑跳进支付宝小程序的大坑
  10. 惠普打印机卡纸问题,解决.