`

MYSQL JDBC的批处理操作三种方式

 
阅读更多

 

SQL批处理是JDBC性能优化的重要武器,经本人研究总结,批处理的用法有三种。
 
package lavasoft.jdbctest; 

import lavasoft.common.DBToolkit; 

import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 
import java.sql.Statement; 

/** 
* JDBC的批量操作三种方式 

* @author leizhimin 2009-12-4 14:42:11 
*/ 
public class BatchExeSQLTest { 

        public static void main(String[] args) { 
                exeBatchStaticSQL(); 
        } 

        /** 
         * 批量执行预定义模式的SQL 
         */ 
        public static void exeBatchParparedSQL() { 
                Connection conn = null; 
                try { 
                        conn = DBToolkit.getConnection(); 
                        String sql = "insert into testdb.book (kind, name) values (?,?)"; 
                        PreparedStatement pstmt = conn.prepareStatement(sql); 
                        pstmt.setString(1, "java"); 
                        pstmt.setString(2, "jjjj"); 
                        pstmt.addBatch();                     //添加一次预定义参数 
                        pstmt.setString(1, "ccc"); 
                        pstmt.setString(2, "dddd"); 
                        pstmt.addBatch();                     //再添加一次预定义参数 
                        //批量执行预定义SQL 
                        pstmt.executeBatch(); 
                } catch (SQLException e) { 
                        e.printStackTrace(); 
                } finally { 
                        DBToolkit.closeConnection(conn); 
                } 
        } 

        /** 
         * 批量执行混合模式的SQL、有预定义的,还有静态的 
         */ 
        public static void exeBatchMixedSQL() { 
                Connection conn = null; 
                try { 
                        conn = DBToolkit.getConnection(); 
                        String sql = "insert into testdb.book (kind, name) values (?,?)"; 
                        PreparedStatement pstmt = conn.prepareStatement(sql); 
                        pstmt.setString(1, "java"); 
                        pstmt.setString(2, "jjjj"); 
                        pstmt.addBatch();    //添加一次预定义参数 
                        pstmt.setString(1, "ccc"); 
                        pstmt.setString(2, "dddd"); 
                        pstmt.addBatch();    //再添加一次预定义参数 
                        //添加一次静态SQL 
                        pstmt.addBatch("update testdb.book set kind = 'JAVA' where kind='java'"); 
                        //批量执行预定义SQL 
                        pstmt.executeBatch(); 
                } catch (SQLException e) { 
                        e.printStackTrace(); 
                } finally { 
                        DBToolkit.closeConnection(conn); 
                } 
        } 

        /** 
         * 执行批量静态的SQL 
         */ 
        public static void exeBatchStaticSQL() { 
                Connection conn = null; 
                try { 
                        conn = DBToolkit.getConnection(); 
                        Statement stmt = conn.createStatement(); 
                        //连续添加多条静态SQL 
                        stmt.addBatch("insert into testdb.book (kind, name) values ('java', 'java in aciton')"); 
                        stmt.addBatch("insert into testdb.book (kind, name) values ('c', 'c in aciton')"); 
                        stmt.addBatch("delete from testdb.book where kind ='C#'"); 
                        stmt.addBatch("update testdb.book set kind = 'JAVA' where kind='java'"); 
//                        stmt.addBatch("select count(*) from testdb.book");                //批量执行不支持Select语句 
                        //执行批量执行 
                        stmt.executeBatch(); 
                } catch (SQLException e) { 
                        e.printStackTrace(); 
                } finally { 
                        DBToolkit.closeConnection(conn); 
                } 
        } 
}
 

Mysql批量插入executeBatch的性能问题  

2011-09-14 14:54:47|  分类: 技术相关|举报|字号 订阅

 
 

移动MAS短信平台用的是Mysql 4.0.20版本。虽提供有各种接口,但DB接口相信是效率最高的。开发接口程序,使用JDBC连接,prepareStatement和executeBatch批量插入数据,然而当每批量设为200条时,耗时约7秒左右。问题出在哪里?

     SmsSent.connMysql.setAutoCommit(false);
     SmsSent.logger.debug("Mysql批量执行开始");
     SmsSent.insMysql.executeBatch();
     SmsSent.logger.debug("Mysql批量插入");
     SmsSent.connSybase.setAutoCommit(false);
     SmsSent.updSybase.executeBatch();
     SmsSent.logger.debug("Sybase批量更新");
     SmsSent.connSybase.commit();
     SmsSent.logger.debug("Sybase批量更新成功。");
     SmsSent.connMysql.commit(); //

     SmsSent.logger.debug("Mysql批量更新成功。");
     SmsSent.connMysql.setAutoCommit(true);
     SmsSent.connSybase.setAutoCommit(true);
查看日志,会发现耗时主要出现在“mysql批量执行开始”和“Mysql批量插入”之间,其余操作包括Sybase的200条语句更新都是毫秒级的。查找文档,得出以下结论:

老版Mysql的JDBC驱动中对批量更新executeBatch仍是以逐条方式进行的,这一点有网友捕捉通讯报文得以证实。虽然已经使用了预编译语句,仍会与Mysql产生200次通讯交互,由于该移动服务器不在本省,ping之有30多毫秒的延迟,200X30就是将近6秒的时间,当然如此计算并不科学,但仍能反映出问题所在。

所以结论就是200条更新的时间花费在通讯开销上。

若要解决问题需使用Mysql的JDBC驱动mysql-connector-java-5.1.13以上,此时可在连接URL中加入rewriteBatchedStatements=true 来使其缓冲后批量更新以提高性能。从网友的测试结果上来看性能提高将近10倍以上。Mysql库本身在3.1.13以上支持此参数。

悲剧的是,之前自己的测试证实Mysql 4.0.20是不支持5甚至4以上版本的JDBC驱动的(官方文档中也有注明)。本人使用的是3.1.14版驱动,加入以上参数后,并未报错,然而性能未有任何提高。

Mas升级mysql版本可能性不大,那么将程序放在Mas库所在机器上倒可以解决问题。

 
分享到:
评论

相关推荐

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

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

    Mysql JDBC驱动 .zip_MYSQL_jdbc mysql_mysql jdbc_mysql jdbc driver_

    综上所述,MySQL JDBC驱动是Java开发者与MySQL数据库通信的重要桥梁,通过它,我们可以方便地执行SQL语句,进行数据操作。了解并熟练掌握JDBC和MySQL JDBC驱动的使用,对于任何Java开发人员来说都是必要的技能。

    mysql jdbc驱动包

    此外,JDBC批处理功能允许一次发送多个SQL语句,提高效率。 为了确保最佳性能和安全性,开发者应关注以下几个方面: - 使用最新的JDBC驱动版本,以获取最新的特性、优化和安全修复。 - 配置连接池,如C3P0、...

    mysql jdbc 驱动包

    在这个"mysql jdbc 驱动包"中,包含了两个不同版本的驱动:MysqlJDBC驱动包5.1.7和mysql-connector-java-5.1.5。 首先,让我们深入了解一下JDBC。JDBC是Java平台上的一个标准接口,由Sun Microsystems开发,用于...

    MySQL jdbc连接器 jdbc.zip

    它是MySQL官方提供的一个开源、免费的Java Database Connectivity (JDBC) 驱动,使得Java开发者能够通过编写Java代码来操作MySQL数据库。在描述中提到的"5-8版本的连接器"涵盖了从MySQL 5.0到8.0的主要版本,这些...

    mysql jdbc jar包

    MySQL JDBC Jar包是Java开发者连接MySQL数据库的重要工具,它提供了Java应用程序与MySQL数据库之间的桥梁,使得数据操作变得简单而高效。在Java编程中,JDBC(Java Database Connectivity)是Java平台的标准接口,...

    mysql JDBC 5.1 6.0

    MySQL JDBC驱动程序是Java应用程序与MySQL数据库之间通信的桥梁,它允许Java开发者使用SQL语句来操作MySQL数据库。本文将详细解析MySQL JDBC 5.1和6.0这两个版本的关键特性、兼容性、安装与使用,以及它们在数据库...

    JAVA数据库驱动 MYSQL JDBC驱动

    MySQL JDBC驱动,也称为MySQL Connector/J,是实现JDBC规范的特定于MySQL的驱动程序,它允许Java应用程序通过网络连接到MySQL数据库,执行SQL查询,处理结果,并进行数据的增删改查操作。 首先,我们需要理解JDBC的...

    最新mysql jdbc 驱动jar包

    MySQL JDBC驱动主要有四种类型:Type 1、Type 2、Type 3和Type 4,其中Type 4是最新的纯Java实现,提供了更好的性能和兼容性。 "最新mysql jdbc 驱动jar包"指的是当前可获取的、更新到最新版本的MySQL JDBC驱动程序...

    MysqlJdbc连接成功经验完整版

    JDBC提供了一种统一的接口,使得Java程序可以以相同的方式访问不同的数据库系统,包括MySQL。 1. **安装MySQL驱动** 在使用JDBC连接MySQL之前,确保已经下载并安装了MySQL的JDBC驱动,也就是`mysql-connector-java...

    mysql jdbc

    MySQL JDBC,全称为Java Database Connectivity,是Java编程语言与MySQL数据库进行交互的一种接口。它遵循JDBC(Java Database Connectivity)规范,允许Java开发者在应用程序中执行SQL语句,实现对MySQL数据库的...

    mysql-connector-java Linux下MySQL的JDBC驱动Jar包

    JDBC提供了一种统一的方法来处理SQL语句,包括查询、更新和操作数据库。 2. MySQL JDBC驱动: MySQL的JDBC驱动,即“mysql-connector-java”,是一个实现了JDBC接口的Java库,使得Java程序能够在运行时连接到MySQL...

    mysql jdbc 驱动

    MySQL JDBC驱动,全称为MySQL Connector/J,是MySQL官方提供的用于Java应用程序与MySQL数据库进行交互的Java Database Connectivity (JDBC) 驱动程序。这个驱动允许Java开发者通过编写Java代码来执行SQL语句,实现对...

    mysql的JDBC驱动包

    MySQL的JDBC驱动包是Java开发中连接MySQL数据库的关键组件,它允许Java应用程序通过Java Database Connectivity (JDBC) API与MySQL服务器进行交互。在本文中,我们将深入探讨MySQL JDBC驱动的工作原理、安装过程、...

    MySql JdBc

    除了基本操作,JDBC还支持事务处理、批处理、预编译的SQL语句(提高性能)以及连接池管理等高级特性。例如,可以使用`Connection.setAutoCommit(false)`开启手动提交模式,然后通过`Connection.commit()`或`...

    mysqljdbc src

    在"mysqljdbc src"中,我们探讨的是MySQL JDBC 5的源代码,这为我们提供了深入理解其内部工作原理的机会。 源代码分析通常有助于开发者调试问题、优化性能、学习设计模式以及自定义功能。MySQL JDBC 5源码包含了...

    JDBC高级批处理

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

    最新版 JDBC,版本号为mysql-connector-java-8.0.16

    JDBC(Java Database Connectivity)是Java编程语言与各种数据库之间通信的一种标准接口。最新版的JDBC驱动程序,即mysql-connector-java-8.0.16,是MySQL官方提供的用于连接Java应用程序到MySQL数据库的工具。这个...

    Mysql JDBC Driver

    它是Java Database Connectivity (JDBC) 的一个实现,遵循了Java的标准接口规范,使得Java开发者能够方便地在应用中操作MySQL数据库。 MySQL Connector/J的工作原理主要基于JDBC API,它提供了一组Java类和接口,...

Global site tag (gtag.js) - Google Analytics