1. 故事背景:
mysql数据迁移到oracle,其中有个表名叫“bil_vip”,有10万条记录,迁移后检查发现oracle数据库只插入34464条记录,程序执行过程没有发现任何错误。修改数据库连接代码向mysql插入10万条记录,结果都插入OK。
批量插入使用spring jdbctemplate.batchUpdate(sql, new BatchPreparedStatementSetter());方法,该方法的核心是PreparedStatement的executeBatch方法。
2. 继续实验:
新建一个Test表,只有一个name字段做实验。
抛弃jdbctemplate,直接使用PreparedStatement做实验,结果和jdbcTemplate是一样的,实验证明总是会丢失65536条记录。
oracle 驱动的问题?换了最新driver,还是不行。继续探索....
3. 希望之光:
早上发了个消息向大家征求思路,继中说了一句分批处理,点亮了我的思路。按照继中提供思路,每1万条记录一批,分多批发送给Oracle。
结果喜出望外,10万条记录全部插入成功。但是"65536"这个数字是什么意思呢......
在网上搜索文章发现,这个65536是一个bug。当PreparedStatement批量处理正好65536个记录时候,程序会挂死。我试了一下真的挂死了,太吓人了,这坑够深的。
4. 解决方案:
spring jdbctemplate还是很好用的,而且业务已经被我封装了,如果使用PreparedStatement意味着多了一个处理分支,以后维护会很麻烦。
我新建一个MyJdbcTemplate类,继承 jdbctemplate类,并覆盖了batchUpdate方法。这下舒服了,系统又恢复了整洁。
5. ★ 结论和收获:
ü 有事多思考,多请教身边同事。
ü 坚持Open-close原则(Open for extension, Closed for modification)会系统更好的扩展,非常容易维护,关键是要坚持这个原则,如果我因为一个特殊分支使用了PreparedStatement,这样势必破坏了这个原则,日后的维护必然会很麻烦。
ü 基于oracle数据如果使用jdbc批量,一定要分批发送数据oracle,否则正好发一个65536系统就挂死,大于65536数据就丢失,杯具呀......
6. 题目何以为“血案”:
周二打球回家就想这个问题,打开笔记本调试,不知不觉搞到很晚,影响媳妇睡觉(媳妇早上5:30上班),被痛骂一顿,赶紧上床睡觉,我媳妇气的不行,手痛砸了一下床板(我们的床撤掉了床垫,只有床架和木板),床一下子塌了,把媳妇吓坏了,把我腿弄伤了一块,唉,“血案”呀。
更深入的文章:
NetworkClient PreparedStatement.executeBatch() hangs if batch is too large (ArrayIndexOutOfBoundsException in Network Server)
https://issues.apache.org/jira/browse/DERBY-428
分享到:
相关推荐
在实际应用中,"batchinsert"可能是一个包含示例代码的文件,展示了如何使用JDBC批量插入Blob字段的具体实现。通过研究和理解这些代码,你可以更好地掌握批量插入Blob数据的技巧,并根据自己的需求进行调整和优化。 ...
Oracle JDBC Jar包是Java应用程序与Oracle数据库交互的重要组件。它提供了Java编程语言访问Oracle数据库的接口,使得开发者能够在Java环境中执行SQL语句、处理结果集、管理事务等操作。Oracle JDBC驱动主要有四种...
在本篇文章中,我们将详细探讨Oracle JDBC驱动的不同版本,包括ojdbc6.jar、ojdbc7.jar、ojdbc8.jar、ojdbc10.jar以及ojdbc11.jar,以及它们各自的特点和适用场景。 首先,JDBC(Java Database Connectivity)是...
Oracle JDBC驱动包是Oracle数据库与Java应用程序之间进行通信的关键组件,它使得Java程序员能够通过编写Java代码来操作Oracle数据库。标题中的"ojdbc6"指的是Oracle JDBC驱动的一个特定版本,适用于Java SE 6环境。...
3. **批量插入**:在Oracle OCI中,批量插入通常涉及使用oci_bind_array_by_name函数将一组数据绑定到同一个SQL插入语句中的多个占位符。这组数据可以是二维数组或其他合适的数据结构。执行oci_execute时,数据库一...
### Java代码实现Oracle数据库批量插入的关键知识点 #### 1. JDBC连接配置 - **JDBC URL**: `jdbc:oracle:thin:@IP:1521:orcl`,这里的URL指定了连接到Oracle数据库的方式。其中`@IP:1521:orcl`中的IP是指数据库...
对于Oracle数据库而言,Oracle官方提供了专门的JDBC驱动程序——Oracle JDBC Driver,以支持Java应用与Oracle数据库之间的通信。 #### 二、Oracle JDBC连接字符串解析 连接Oracle数据库时,需要正确配置JDBC连接...
原书名:Oracle 9i Java Programming <br>Oracle 9i Java程序设计——使用PL/SQL和Java的解决方案 <br>【原出版社】 Wrox Press 【作 者】Bjarki Holm,John Carnell等 【译 者】 康博 【丛 ...
Oracle12C JDBC驱动是连接Java应用程序与Oracle数据库12c Release 2 (12.2.0.1) 的关键组件。JDBC(Java Database Connectivity)是Java平台中的一个标准API,它允许Java程序通过Java语言来访问和操作数据库。在...
Oracle JDBC 连接类是 Oracle 数据库与 Java 应用程序之间进行通信的重要桥梁。Java Database Connectivity (JDBC) 是 Java 平台的标准接口,它允许程序员使用 Java 语言来执行 SQL 命令,从而操作数据库。Oracle ...
JDBC——连接oracle数据库
Oracle 12c JDBC驱动包是Oracle数据库与Java应用程序之间的桥梁,它允许Java开发者通过编写Java代码来访问和操作Oracle数据库。在Java编程环境中,JDBC(Java Database Connectivity)是标准API,用于连接各种类型的...
Oracle JDBC驱动程序允许Java应用程序通过Java代码与Oracle数据库进行交互,执行SQL查询、更新数据库记录以及管理事务等操作。在11g Release 2版本中,11.2.0.4是一个重要的维护版本,包含了一些性能优化、bug修复...
根据提供的文件信息,我们可以深入探讨Oracle JDBC的相关知识点。Oracle JDBC(Java Database Connectivity)是一种用于连接Java应用程序与Oracle数据库的技术。它允许开发人员使用标准的Java编程接口来访问Oracle...
本篇文章将详细介绍如何利用Java和MyBatis实现批量插入数据到Oracle数据库中。 首先,我们需要理解Oracle数据库的一些基本概念。Oracle是世界上最流行的商业关系型数据库管理系统之一,以其强大的功能和高可靠性而...
Oracle JDBC驱动程序是Java应用程序与Oracle数据库之间通信的桥梁,使得开发者可以利用Java语言执行SQL语句和处理数据库数据。标题中的"10g与9i"指的是Oracle数据库的两个不同版本,即Oracle Database 10g和9i。这些...
7. **批处理**: 使用`Statement`的`addBatch()`和`executeBatch()`方法可以批量执行SQL插入、更新或删除操作,提高效率。 8. **游标**: Oracle JDBC支持游标,允许应用程序一次处理结果集中的一行数据,从而处理...
相比于单条插入,批量插入减少了网络往返次数,提高了整体的吞吐量。 ### 二、代码详解 #### 1. 准备SQL语句 ```java PreparedStatement stmt = conn.prepareStatement("INSERT INTO trafficinfotab_" + ...
Oracle JDBC Driver Package,简称为Oracle JDBC驱动包,是Oracle公司为Java开发者提供的用于与Oracle数据库进行交互的重要组件。这个正版的驱动包确保了开发者能够安全、高效地通过Java应用程序访问和操作Oracle...
oracle批量生成数据脚本,oracle批量生成数据脚本,oracle批量生成数据脚本,oracle批量生成数据脚本。