`
dannyhz
  • 浏览: 388075 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

jdbc访问mysql数据库急速

 
阅读更多
http://blog.csdn.net/whucyl/article/details/20838079

使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(10W+),如何提高效率呢?
在JDBC编程接口中Statement 有两个方法特别值得注意:
void addBatch() throws SQLException
Adds a set of parameters to this PreparedStatement object's batch of commands.
int[] executeBatch() throws SQLException
Submits a batch of commands to the database for execution and if all commands execute successfully, returns an array of update counts. The int elements of the array that is returned are ordered to correspond to the commands in the batch, which are ordered according to the order in which they were added to the batch.

通过使用addBatch()和executeBatch()这一对方法可以实现批量处理数据。

不过值得注意的是,首先需要在数据库链接中设置手动提交,connection.setAutoCommit(false),然后在执行Statement之后执行connection.commit()。
[java] view plain copy print?
package cyl.demo.ipsearcher; 
 
import java.io.BufferedReader; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 
 
public class DbStoreHelper { 
 
    private String insert_sql; 
    private String charset; 
    private boolean debug; 
 
    private String connectStr; 
    private String username; 
    private String password; 
 
    public DbStoreHelper() { 
        connectStr = "jdbc:mysql://localhost:3306/db_ip"; 
        // connectStr += "?useServerPrepStmts=false&rewriteBatchedStatements=true"; 
        insert_sql = "INSERT INTO tb_ipinfos (iplong1,iplong2,ipstr1,ipstr2,ipdesc) VALUES (?,?,?,?,?)"; 
        charset = "gbk"; 
        debug = true; 
        username = "root"; 
        password = "***"; 
    } 
 
    public void storeToDb(String srcFile) throws IOException { 
        BufferedReader bfr = new BufferedReader(new InputStreamReader(new FileInputStream(srcFile), charset)); 
        try { 
            doStore(bfr); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } finally { 
            bfr.close(); 
        } 
    } 
 
    private void doStore(BufferedReader bfr) throws ClassNotFoundException, SQLException, IOException { 
        Class.forName("com.mysql.jdbc.Driver"); 
        Connection conn = DriverManager.getConnection(connectStr, username,password); 
        conn.setAutoCommit(false); // 设置手动提交 
        int count = 0; 
        PreparedStatement psts = conn.prepareStatement(insert_sql); 
        String line = null; 
        while (null != (line = bfr.readLine())) { 
            String[] infos = line.split(";"); 
            if (infos.length < 5)   continue; 
            if (debug) { 
                System.out.println(line); 
            } 
            psts.setLong(1, Long.valueOf(infos[0])); 
            psts.setLong(2, Long.valueOf(infos[1])); 
            psts.setString(3, infos[2]); 
            psts.setString(4, infos[3]); 
            psts.setString(5, infos[4]); 
            psts.addBatch();          // 加入批量处理 
            count++;             
        } 
        psts.executeBatch(); // 执行批量处理 
        conn.commit();  // 提交 
        System.out.println("All down : " + count); 
        conn.close(); 
    } 
 


执行完成以后:
[plain] view plain copy print?
All down : 103498 
Convert finished. 
All spend time/s : 47 
一共10W+,执行时间一共花费 47 秒.

这个效率仍然不高,似乎没有达到想要的效果,需要进一步改进。
在MySQL JDBC连接字符串中还可以加入参数,
rewriteBatchedStatements=true,mysql默认关闭了batch处理,通过此参数进行打开,这个参数可以重写向数据库提交的SQL语句,具体参见:http://www.cnblogs.com/chenjianjx/archive/2012/08/14/2637914.html
useServerPrepStmts=false,如果不开启(useServerPrepStmts=false),使用com.mysql.jdbc.PreparedStatement进行本地SQL拼装,最后送到db上就是已经替换了?后的最终SQL.

在此稍加改进,连接字符串中加入下面语句(代码构造方法中去掉注释):
connectStr += "?useServerPrepStmts=false&rewriteBatchedStatements=true";

再次执行如下:
[plain] view plain copy print?
All down : 103498 
Convert finished. 
All spend time/s : 10 
同样的数据量,这次执行只花费了10秒 ,处理效率大大提高.
分享到:
评论

相关推荐

    java 实现学生管理系统 JDBC +mysql数据库

    Java+JDBC +mysql数据库 实现学生的增删改查等功能 可以选择 不同的功能来实现 增删改查 Java+JDBC +mysql数据库 实现学生的增删改查等功能 Java+JDBC +mysql数据库 实现学生的增删改查等功能 Java+JDBC +mysql...

    android通过JDBC直接访问Mysql数据库

    ### Android通过JDBC直接访问MySQL数据库 #### 一、引言 随着移动应用开发的不断发展,Android应用程序常常需要与后端数据库进行交互以提供丰富的功能和服务。传统的Android应用与数据库的交互方式通常采用RESTful ...

    JDBC访问MySQL数据库.docx

    在使用JDBC访问MySQL数据库时,我们需要遵循以下步骤: 1. **导入驱动包**: - 首先,我们需要获取到MySQL的JDBC驱动,即`mysql-connector-java-xxxx.jar`文件。这个文件包含了Java程序与MySQL数据库通信所需的类...

    jdbc连接mysql数据库,实现增删改查

    本教程将深入探讨如何使用JDBC连接MySQL数据库并实现增、删、改、查(CRUD)操作。首先,我们需要确保已经安装了MySQL数据库,并且在系统中配置了相应的驱动。 1. **引入MySQL JDBC驱动** 要使用JDBC与MySQL通信,...

    PB通过JDBC连MYSQL教程

    JDBC(Java Database Connectivity)是Java语言中用于连接数据库的标准API,而MySQL则是一种广泛使用的开源关系型数据库管理系统。本教程将深入探讨如何使用PB通过JDBC来连接MySQL数据库。 首先,我们需要确保已经...

    JDBC连接Mysql数据库案例

    本案例将探讨如何使用JDBC连接MySQL数据库,并通过实际的代码示例讲解整个过程。我们将涉及以下知识点: 1. **JDBC驱动注册**: 在Java中,连接MySQL数据库首先需要加载并注册JDBC驱动。MySQL的JDBC驱动类是`...

    在Eclipse中用JDBC连接MySQL数据库!.txt

    ### 在Eclipse中使用JDBC连接MySQL数据库的关键步骤与注意事项 #### 一、准备工作与环境配置 1. **下载MySQL数据库:** - 版本选择:MySQL 6.0。 - 下载地址:[http://dev.mysql.com/downloads/mysql/6.0.html]...

    JDBC实现MYSQL数据库迁徙

    首先,JDBC是Java语言访问数据库的标准API,它允许Java程序与各种数据库进行交互,包括MySQL。通过JDBC,我们可以执行SQL语句,获取结果集,以及进行事务处理等操作。在数据库迁移中,我们需要利用JDBC连接源数据库...

    JDBC连接MySQL数据库关键的四个步骤

    JDBC(Java Database Connectivity)作为Java平台上的标准数据库访问接口,允许Java程序通过标准SQL语句来访问各种关系型数据库。本文将详细介绍如何使用JDBC连接MySQL数据库的关键四个步骤。 #### 一、下载并配置...

    JDBC连接MySQL数据库8.0.13的驱动包

    在本案例中,"JDBC连接MySQL数据库8.0.13的驱动包" 提供了连接MySQL 8.0.13版本数据库所需的Java驱动程序。MySQL是一种开源、免费的关系型数据库管理系统,广泛应用于Web应用、企业内部系统以及各类数据存储需求。 ...

    JDBC连接MySQL数据库的方法浅析.pdf

    它为Java开发者提供了一个统一的接口,用于访问各种不同的SQL数据库,包括MySQL。JDBC允许Java程序通过发送SQL语句来操作数据库,实现数据的增删查改。 1. JDBC技术概述 JDBC的核心是一系列的Java接口和类,这些...

    \纯JDBC连接MySQl数据库.doc

    1. **JDBC API**:JDBC是Java中用于访问数据库的标准API,它提供了一组接口和类,使得开发者可以编写与数据库无关的代码。在上述代码中,`java.sql.Connection`、`java.sql.Statement`和`java.sql.ResultSet`是JDBC...

    JDBC连接MySQL例子

    本示例是关于如何使用JDBC连接MySQL数据库的一个实践教程,涵盖了数据库连接、数据操作以及大文本和图片的存储。 首先,我们需要了解JDBC的基本流程,包括加载驱动、建立连接、创建Statement或PreparedStatement...

    JDBC调用MySQL数据库.rar

    Java JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,它提供了标准的方法来连接、查询和操作数据库系统。本示例是关于如何使用Java JDBC与MySQL数据库进行交互的...

    jdbc连接mysql数据库

    JDBC(Java Database Connectivity)是Java编程语言中用于与关系型数据库交互的一种接口,它使得开发者能够使用标准的Java API来访问各种类型的数据库系统。在本主题中,我们将深入探讨如何使用JDBC连接MySQL数据库...

    JDBC-MySQL数据库驱动

    标题“JDBC-MySQL数据库驱动”指的是Java Database Connectivity (JDBC) 驱动程序,这是Java编程语言与MySQL关系型数据库管理系统之间通信的桥梁。描述中同样提到了JDBC-MySQL数据库驱动,进一步确认了主题是关于...

    java web 项目JDBC连接MySQL数据库

    java web项目,使用JDBC连接MySQL数据库,首先得在本机的MySQL数据库中创建相应的数据库和数据表,并添加相关数据,解压后在MyEclipse中通过import向导将整个文件夹加入到工程中,然后运行即可。

    android通过JDBC直接访问Mysql数据库.docx

    Android 通过 JDBC 直接访问 Mysql 数据库 Android 通过 JDBC 直接访问 Mysql 数据库是 Android 开发中的一种常见需求。下面将详细介绍 Android 通过 JDBC 访问 Mysql 数据库的方法和注意事项。 一、 Android 中...

Global site tag (gtag.js) - Google Analytics