`
heipark
  • 浏览: 2097422 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle jdbc 邪恶数字"65536" —— 使用prepareStatement批量插入10万条记录引发的“血案”

阅读更多

1.   故事背景:

mysql数据迁移到oracle,其中有个表名叫“bil_vip”,有10万条记录,迁移后检查发现oracle数据库只插入34464条记录,程序执行过程没有发现任何错误。修改数据库连接代码向mysql插入10万条记录,结果都插入OK

批量插入使用spring jdbctemplate.batchUpdate(sql, new BatchPreparedStatementSetter());方法,该方法的核心是PreparedStatementexecuteBatch方法。

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

 

 

分享到:
评论

相关推荐

    jdbc批量插入大字段

    在实际应用中,"batchinsert"可能是一个包含示例代码的文件,展示了如何使用JDBC批量插入Blob字段的具体实现。通过研究和理解这些代码,你可以更好地掌握批量插入Blob数据的技巧,并根据自己的需求进行调整和优化。 ...

    oracle jdbc jar包

    Oracle JDBC Jar包是Java应用程序与Oracle数据库交互的重要组件。它提供了Java编程语言访问Oracle数据库的接口,使得开发者能够在Java环境中执行SQL语句、处理结果集、管理事务等操作。Oracle JDBC驱动主要有四种...

    Oracle JDBC jar包下载

    在本篇文章中,我们将详细探讨Oracle JDBC驱动的不同版本,包括ojdbc6.jar、ojdbc7.jar、ojdbc8.jar、ojdbc10.jar以及ojdbc11.jar,以及它们各自的特点和适用场景。 首先,JDBC(Java Database Connectivity)是...

    oracle.jdbc.driver.oracledriver Oracle JDBC驱动包 ojdbc6

    Oracle JDBC驱动包是Oracle数据库与Java应用程序之间进行通信的关键组件,它使得Java程序员能够通过编写Java代码来操作Oracle数据库。标题中的"ojdbc6"指的是Oracle JDBC驱动的一个特定版本,适用于Java SE 6环境。...

    oracle oci 批量插入源代码

    3. **批量插入**:在Oracle OCI中,批量插入通常涉及使用oci_bind_array_by_name函数将一组数据绑定到同一个SQL插入语句中的多个占位符。这组数据可以是二维数组或其他合适的数据结构。执行oci_execute时,数据库一...

    java代码oracle数据库批量插入

    ### Java代码实现Oracle数据库批量插入的关键知识点 #### 1. JDBC连接配置 - **JDBC URL**: `jdbc:oracle:thin:@IP:1521:orcl`,这里的URL指定了连接到Oracle数据库的方式。其中`@IP:1521:orcl`中的IP是指数据库...

    Oracle JDBC连接字符串

    对于Oracle数据库而言,Oracle官方提供了专门的JDBC驱动程序——Oracle JDBC Driver,以支持Java应用与Oracle数据库之间的通信。 #### 二、Oracle JDBC连接字符串解析 连接Oracle数据库时,需要正确配置JDBC连接...

    Oracle 9i Java程序设计——使用PL/SQL和Java的解决方案

    原书名:Oracle 9i Java Programming <br>Oracle 9i Java程序设计——使用PL/SQL和Java的解决方案 <br>【原出版社】 Wrox Press 【作 者】Bjarki Holm,John Carnell等 【译 者】 康博 【丛 ...

    Oracle12C JDBC 驱动

    Oracle12C JDBC驱动是连接Java应用程序与Oracle数据库12c Release 2 (12.2.0.1) 的关键组件。JDBC(Java Database Connectivity)是Java平台中的一个标准API,它允许Java程序通过Java语言来访问和操作数据库。在...

    OracleJDBC连接类

    Oracle JDBC 连接类是 Oracle 数据库与 Java 应用程序之间进行通信的重要桥梁。Java Database Connectivity (JDBC) 是 Java 平台的标准接口,它允许程序员使用 Java 语言来执行 SQL 命令,从而操作数据库。Oracle ...

    JDBC——连接oracle数据库

    JDBC——连接oracle数据库

    oracle12 jdbc驱动包

    Oracle 12c JDBC驱动包是Oracle数据库与Java应用程序之间的桥梁,它允许Java开发者通过编写Java代码来访问和操作Oracle数据库。在Java编程环境中,JDBC(Java Database Connectivity)是标准API,用于连接各种类型的...

    Oracle JDBC驱动11.2.0.4

    Oracle JDBC驱动程序允许Java应用程序通过Java代码与Oracle数据库进行交互,执行SQL查询、更新数据库记录以及管理事务等操作。在11g Release 2版本中,11.2.0.4是一个重要的维护版本,包含了一些性能优化、bug修复...

    oracle-jdbc官方文档

    根据提供的文件信息,我们可以深入探讨Oracle JDBC的相关知识点。Oracle JDBC(Java Database Connectivity)是一种用于连接Java应用程序与Oracle数据库的技术。它允许开发人员使用标准的Java编程接口来访问Oracle...

    Java实现mybatis批量插入数据到Oracle

    本篇文章将详细介绍如何利用Java和MyBatis实现批量插入数据到Oracle数据库中。 首先,我们需要理解Oracle数据库的一些基本概念。Oracle是世界上最流行的商业关系型数据库管理系统之一,以其强大的功能和高可靠性而...

    oracle JDBC驱动程序

    Oracle JDBC驱动程序是Java应用程序与Oracle数据库之间通信的桥梁,使得开发者可以利用Java语言执行SQL语句和处理数据库数据。标题中的"10g与9i"指的是Oracle数据库的两个不同版本,即Oracle Database 10g和9i。这些...

    oracle-jdbc-12.2.0.1.zip

    7. **批处理**: 使用`Statement`的`addBatch()`和`executeBatch()`方法可以批量执行SQL插入、更新或删除操作,提高效率。 8. **游标**: Oracle JDBC支持游标,允许应用程序一次处理结果集中的一行数据,从而处理...

    java批量插入Oracle数据方法

    相比于单条插入,批量插入减少了网络往返次数,提高了整体的吞吐量。 ### 二、代码详解 #### 1. 准备SQL语句 ```java PreparedStatement stmt = conn.prepareStatement("INSERT INTO trafficinfotab_" + ...

    oracle jdbc diver package 正版

    Oracle JDBC Driver Package,简称为Oracle JDBC驱动包,是Oracle公司为Java开发者提供的用于与Oracle数据库进行交互的重要组件。这个正版的驱动包确保了开发者能够安全、高效地通过Java应用程序访问和操作Oracle...

    oracle批量插入数据脚本

    oracle批量生成数据脚本,oracle批量生成数据脚本,oracle批量生成数据脚本,oracle批量生成数据脚本。

Global site tag (gtag.js) - Google Analytics