`

Java JDBC 批处理

    博客分类:
  • Java
 
阅读更多

 

Java JDBC 批处理

在此笔记里,我们将看到我们如何可以使用像Statement和PreparedStatement JDBC API来批量在任何数据库中插入数据。此外,我们将努力探索一些场景,如在内存不足时正常运行,以及如何优化批量操作。

首先,使用Java JDBC基本的API批量插入数据到数据库中。

Simple Batch - 简单批处理
<wbr><wbr><wbr><wbr>我把它叫做简单批处理。要求很简单,执行批量插入列表,而不是为每个INSERT语句每次提交数据库,我们将使用JDBC批处理操作和优化性能。</wbr></wbr></wbr></wbr>

想想一下下面的代码:

Bad Code
 

String [] queries = {
    "insert into employee (name, city, phone) values ('A', 'X', '123')",

 "insert into employee (name, city, phone) values ('B', 'Y', '234')",
    

"insert into employee (name, city, phone) values ('C', 'Z', '345')",
 };

 Connection connection = new getConnection();


Statement statemenet = connection.createStatement();
 

for (String query : queries) 

{
    statemenet.execute(query);
}

 statemenet.close();


connection.close();

 

这是糟糕的代码。它单独执行每个查询,每个INSERT语句的都提交一次数据库。考虑一下,如果你要插入1000条记录呢?这是不是一个好主意。

下面是执行批量插入的基本代码。来看看:

 

Good Code

Connection connection = new getConnection();


Statement statemenet = connection.createStatement();

 for (String query : queries) {
    

statemenet.addBatch(query);

 }


statemenet.executeBatch();


statemenet.close();


connection.close();

 

请注意我们如何使用addBatch()方法,而不是直接执行查询。然后,加入所有的查询,我们使用statement.executeBatch()方法一次执行他们。没有什么花哨,只是一个简单的批量插入。

请注意,我们已经从一个String数组构建了查询。现在,你可能会想,使其动态化。例如:

 

import java.sql.Connection;

 import java.sql.Statement;
//...


Connection connection = new getConnection();

 Statement statemenet = connection.createStatement();


for (Employee employee: employees) {
    

String query = "insert into employee (name, city) values('"
            + employee.getName() + "','" + employee.getCity + "')";
    

statemenet.addBatch(query);
}


statemenet.executeBatch();


statemenet.close();


connection.close();

 

请注意我们是如何从Employee对象中的数据动态创建查询并在批处理中添加,插入一气呵成。完美!是不是?

等等......你必须思考什么关于SQL注入?这样动态创建的查询SQL注入是很容易的。并且每个插入查询每次都被编译。

为什么不使用PreparedStatement而不是简单的声明。是的,这是个解决方案。下面是SQL注入安全批处理。

SQL Injection Safe Batch - SQL注入安全批处理
思考一下下面代码:

import java.sql.Connection;


import java.sql.PreparedStatement;
 //...

 String sql = "insert into employee (name, city, phone) values (?, ?, ?)";


Connection connection = new getConnection();

 PreparedStatement ps = connection.prepareStatement(sql);

 for (Employee employee: employees) {
    

ps.setString(1, employee.getName());

 ps.setString(2, employee.getCity());
    

ps.setString(3, employee.getPhone());

 ps.addBatch();
}


ps.executeBatch();

 ps.close();

 connection.close();

 

看看上面的代码。漂亮。我们使用的java.sql.PreparedStatement和在批处理中添加INSERT查询。这是你必须实现批量插入逻辑的解决方案,而不是上述Statement那个。

这一解决方案仍然存在一个问题。考虑这样一个场景,在您想要插入到数据库使用批处理上万条记录。嗯,可能产生的OutOfMemoryError(内存溢出):

java.lang.OutOfMemoryError: Java heap space
com.mysql.jdbc.ServerPreparedStatement$BatchedBindValues.(ServerPreparedStatement.java:72)
com.mysql.jdbc.ServerPreparedStatement.addBatch(ServerPreparedStatement.java:330)
org.apache.commons.dbcp.DelegatingPreparedStatem<wbr>ent.addBatch(DelegatingPreparedStatem<wbr>ent.java:171)</wbr></wbr>

这是因为你试图在一个批次添加所有语句,并一次插入。最好的办法是将执行分批次。看看下面的解决方案

Smart Insert: Batch within Batch - 智能插入:将整批分批
这是一个简单的解决方案。考虑批量大小为1000,每1000个查询语句为一批插入提交。

String sql = "insert into employee (name, city, phone) values (?, ?, ?)";


Connection connection = new getConnection();


PreparedStatement ps = connection.prepareStatement(sql);


final int batchSize = 1000;

 int count = 0;


for (Employee employee: employees) {

 ps.setString(1, employee.getName());
    

ps.setString(2, employee.getCity());

 ps.setString(3, employee.getPhone());


    ps.addBatch();


    if(++count % batchSize == 0) {

 ps.executeBatch();
    }


}

 ps.executeBatch(); // insert remaining records


ps.close();


connection.close();


这才是理想的解决方案,它避免了SQL注入和内存不足的问题。看看我们如何递增计数器计数,一旦BATCHSIZE 达到 1000,我们调用executeBatch()提交。

 

 

分享到:
评论

相关推荐

    jdbc 批处理.rar

    在给定的博客链接中,可能详细解释了这些概念,并提供了示例代码来演示如何在实际应用中实现JDBC批处理。通过学习这个资源,开发者可以更好地理解和应用批处理技术,提升Java数据库应用程序的效率。

    JDBC批处理数据

    ### JDBC批处理数据 在Java开发中,JDBC(Java Database Connectivity)是一种广泛使用的数据库连接技术,它允许Java应用程序与各种类型的数据库进行交互。当处理大量数据时,使用JDBC进行有效的数据操作变得尤为...

    用pinyin4j 获取拼音简码 + JXL 读写Excl文件 + JDBC 批处理

    例如,如果你需要更新大量用户的数据,可以使用JDBC批处理来批量更新,减少网络通信和数据库事务处理的开销。 结合这三个技术,我们可以实现一个功能强大的系统。例如,一个基于Web的应用可能需要从用户上传的Excel...

    使用JDBC的批处理功能

    本文将详细阐述JDBC批处理的基本概念、优势以及如何在实际应用中使用。 一、批处理的概念 批处理是指一次性提交多个SQL语句到数据库进行执行,而不是逐个发送和执行。在JDBC中,批处理主要通过Statement或...

    JDBC数据库操作值MySQL批处理操作

    总结来说,JDBC是Java中连接数据库的关键,而MySQL批处理是JDBC提供的一种高效的数据处理方式。通过正确使用批处理,开发者可以优化数据库操作,提升应用程序的性能,特别是在处理大数据量时效果显著。在实际开发中...

    Java JDBC规范和用例

    ### Java JDBC规范详解 #### 一、概述与背景 JDBC,即Java Database Connectivity,是Java平台中一种标准的数据访问技术,它允许Java程序通过一套统一的API接口访问各种关系型数据库。JDBC的出现解决了Java应用与...

    javajdbc

    Java JDBC(Java Database Connectivity)是Java编程语言中用于与各种数据库进行交互的一组接口和类。它是Java标准版(Java SE)的一部分,允许Java开发者执行SQL语句并处理结果。在深入探讨Java JDBC之前,先要理解...

    JDBC笔记 方立勋

    方立勋老师的JDBC笔记还会深入到JDBC的高级特性,如JDBC批处理、连接池的使用、JNDI数据源、以及JDBC的最新版本特性等,这些都是Java开发者必须掌握的技能。通过这些笔记的学习,读者将能够熟练地使用JDBC进行数据库...

    JAVA JDBC MYSQL连接源代码

    Java JDBC (Java Database Connectivity) 是Java编程语言中用于与各种数据库进行交互的一组接口和类。它是Java标准的一部分,允许开发者在Java程序中执行SQL语句,实现对数据库的读写操作。本示例主要涉及使用Java ...

    Java jdbc操作mysql

    Java JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,它提供了标准的方法来连接、查询和操作MySQL这样的关系型数据库。MySQL是一款开源、免费的SQL数据库,广泛...

    java jdbc测试mysql数据库

    Java JDBC(Java Database Connectivity)是Java平台中用于与数据库交互的一组接口和类,它使得开发者可以使用标准的SQL语句来访问各种不同类型的数据库。本示例将讲解如何使用Java JDBC连接MySQL数据库,这对于任何...

    java 批处理的资源

    - **JDBC批处理**:通过设置批处理边界,一次性提交多条SQL语句,减少数据库交互次数。 - **Java 8 Stream API**:处理大量数据时,Stream API提供了一种高效且易读的编程方式。 6. **Batch.java文件可能的内容**...

    JDBC高级批处理

    JDBC批处理的实现依赖于数据库驱动的实现,不同数据库的驱动可能会有不同的优化策略。深入研究JDBC源码,可以帮助我们理解批处理在底层是如何工作的,以及如何针对特定数据库优化性能。 ### 8. 工具支持 很多...

    javajdbc宠物商店-Mysql数据库_Java项目jdbc_java宠物项目_数据库代码_

    本项目"javajdbc宠物商店-Mysql数据库"是基于Java JDBC实现的一个宠物商店管理系统的数据库部分,它提供了与MySQL数据库交互的能力。在这个项目中,我们将深入探讨以下几个核心知识点: 1. **JDBC API**: JDBC API...

    java jdbc连接mySql的小例子

    Java JDBC(Java Database Connectivity)是Java编程语言中用于与各种数据库进行交互的一组接口和类。这个小例子展示了如何使用JDBC连接到MySQL数据库。在Java应用中,JDBC提供了标准化的方法来创建、执行SQL语句...

    java批处理

    Java的JDBC API提供了对事务的控制,可以通过try-catch-finally块来管理和回滚事务。 7. **性能优化**:通过缓存、预加载、连接池等手段提高处理速度。例如,使用PreparedStatement预编译SQL语句,可以避免SQL解析...

    JAVA JDBC教程.zip_zip怎么打开

    **JAVA JDBC教程** Java JDBC(Java Database Connectivity)是Java平台中的一个标准API,它允许Java应用程序连接到各种类型的数据库,实现数据的存取和处理。JDBC为开发者提供了一种统一的方式来访问不同的数据库...

    sql2000+java 批处理,测试demo

    对于Java开发者来说,使用JDBC批处理可以有效地管理与数据库的交互,尤其是在处理大量数据时,能够显著提升性能。 【标签】"sql2000+java 批处理" 指明了技术栈,即使用Java编程语言与SQL Server 2000数据库进行...

    JDBC进行批处理共4页.pdf.zip

    **JDBC批处理详解** 在Java数据库连接(Java Database Connectivity, JDBC)中,批处理是一项重要的功能,它允许开发者一次性提交多个SQL语句,从而提高数据处理的效率和性能。批处理是数据库操作中的优化手段,...

    效率很高的java jdbc类

    Java JDBC(Java Database Connectivity)是Java编程语言中用于与数据库交互的一组接口和类,它提供了标准的方法来连接、查询和操作数据库。本篇将详细解释这个“效率很高的java jdbc类”的核心概念和实现。 首先,...

Global site tag (gtag.js) - Google Analytics