jdbc 批量执行sql
最近有个需求是需要在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();
}
注意:
- 数据库区别:
本项目用的是 oracle数据库, 而mysql服务器默认是关闭批处理的,我们需要通过一个参数,让mysql开启批处理的支持。
?rewriteBatchedStatements=true
写在配置文件的url后面
本问题参考自
作者:Nemo
链接:https://www.cnblogs.com/blknemo/
来源:博客园
- 可能出现的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相关推荐
- PreparedStatement批量执行sql
2019独角兽企业重金招聘Python工程师标准>>> 案例: 工具方法: public static Connection getConnection(){try {Class.f ...
- java 批量执行 sql_JDBC批量执行SQL
批量执行SQL,效率比较高,但执行SQL太多,谨防内存溢出. 代码案例一: package com.what21.jdbc.demo05; import java.sql.Connection; im ...
- hive 批量执行sql脚本文件 跳过异常语句
应用场景 hive执行sql的方式很多,在需要批量执行sql的场景下就需要使用到hive 命令 或beeline命令. 使用方式 hive -f a.sql 这个命令会执行a.sql里面的sql命令, ...
- 金蝶EAS客户端批量执行sql代码
//客户端批量执行sql SqlExcFacadeFactory.getRemoteInstance().executeBatch(new String[]{sql});
- 如何用sqlplus执行一个sql文件和批量执行sql文件
1.sqlplus执行单个SQL文件 举个例子,假设你的sql文件是test.sql ,保存路径是D:\script,那么在sqlplus里执行它,用如下语法: sqlplus> @D:\scr ...
- orientDB批量执行SQL
前言: 关于orientDB的中文资源还是太少,几经周折才找到如何批量执行orientDB SQL脚本,下面是我整理的批量执行SQL的办法,可供初学者参考. 开门见山: 我们在初学orientDB时, ...
- JAVA使用JDBC批量插入SQL
数据库连接使用proxool连接JDBC 代码 JAVA类 package com.czr.proxool;import org.logicalcobwebs.proxool.ProxoolExcep ...
- sqlplus中批量执行sql脚本(Oracle)
假如我们有很多sql脚本,如果一个一个sql脚本文件执行显然过于麻烦,下边我们演示sql脚本批量执行. 解决方法:将需要执行的sql脚本文件的@绝对路径 存放到一个脚本文件中,然后执行这个脚本文件就可 ...
- linux下db2创建批量存储过程,DB2批量执行SQL脚本以及存储过程的实现
使用过的命令: 进入db2cmd db2 connect todb_aliasuserusernameusingpassword db2 -tvfc:\abc.sql-labc.log 参考如下: 可 ...
最新文章
- WINKEY功能键你会用吗??
- APP和网站应该选择云主机还是服务器呢?
- STM32 基础系列教程 44 - FSMC_LCD
- Nmap扫描参数解析(转)
- mysql数据库集群架构图_搭建MySQL-Cluster集群架构
- php xml 接口调用,php的SimpleXML方法读写XML接口文件实例解析
- 在debug模式下引入一些性能检测工具
- 【Luogu1908】逆序对(离散化,树状数组求逆序对)
- MSExchangeIS ID8528 日志提示邮箱已满报警
- 黑群晖 DSM 6.2 3617 成功安装教程
- SPSS的中分层聚类法的实际应用详解
- echarts南丁格尔玫瑰图
- C++[Error] expected primary-expression before ‘]‘ token
- AD fanout 各选项说明
- 服务器安装torchvision库文件时报错EnvironmentError: [Errno 28] No space left on device的完美解决方法及思维过程
- Day 1: 音标学习
- 微信发展简史:微信成功的必然和偶然
- java web 流媒体播放_实时流(直播流)播放、上墙(大屏播放)解决方案
- 基于AntDesign UI的自定义表单
- 自媒体行业的5个新变化,跟上新变现,赚钱其实也不难