1、采用公认的MYSQL最快批量提交办法

public void index() throws UnsupportedEncodingException, Exception
{
//1000个一提交
int COMMIT_SIZE=25000;
//一共多少个
int COUNT=100000;

long a=System.currentTimeMillis();
Connection conn= null;

try {
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://10.10.3.13/new_lxyy_db?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true";
String user="root";
String password="dsideal";

conn= DriverManager.getConnection(url,user,password);
long starTime = System.currentTimeMillis();

conn.setAutoCommit(false);
PreparedStatement pstmt = conn.prepareStatement("load data local infile '' "+ "into table loadtest fields terminated by ','");
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= COUNT; i++)
{
sb.append(i + "," + i+"abc" + "\n");
if (i % COMMIT_SIZE == 0)
{
InputStream is = new ByteArrayInputStream(sb.toString().getBytes());
((com.mysql.jdbc.Statement) pstmt).setLocalInfileInputStream(is);
pstmt.execute();
conn.commit();
sb.setLength(0);
}
}
InputStream is = new ByteArrayInputStream(sb.toString().getBytes());
((com.mysql.jdbc.Statement) pstmt).setLocalInfileInputStream(is);
pstmt.execute();
conn.commit();

long endTime = System.currentTimeMillis();
System.out.println("program runs " + (endTime - starTime) + "ms");
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn.close();
}

//在最好的一行加上:
System.out.println("\r插入数据条数:"+COUNT+",提交的阀值:"+COMMIT_SIZE+",执行耗时 : "+(System.currentTimeMillis()-a)/1000f+" 秒 ");
renderNull();
}

2、对于表采用MyIsam引擎,效果嗷嗷的!

插入数据条数:40000,提交的阀值:1000,执行耗时 : 0.379 秒
插入数据条数:40000,提交的阀值:500,执行耗时 : 0.527 秒
插入数据条数:40000,提交的阀值:2000,执行耗时 : 0.306 秒
插入数据条数:40000,提交的阀值:5000,执行耗时 : 0.253 秒
插入数据条数:40000,提交的阀值:10000,执行耗时 : 0.198 秒
插入数据条数:40000,提交的阀值:15000,执行耗时 : 0.197 秒

插入数据条数:40000,提交的阀值:20000,执行耗时 : 0.255 秒
插入数据条数:40000,提交的阀值:25000,执行耗时 : 0.208 秒

插入数据条数:100000,提交的阀值:25000,执行耗时 : 0.402 秒

以上数据是在吴缤的MYSQL机器上获取的,我的机器上的海豚数据如下:

插入数据条数:100000,提交的阀值:25000,执行耗时 : 0.226 秒

注:后来黄海在研究如何批量更新数据时,找到了如下的方法:

把数据保存到一个文本文件中,字段间用TAB分隔,然后在mysql中执行

LOAD DATA INFILE "/PATH/oo.txt" REPLACE INTO TABLE xx; 有时间应该试试,据说效果不错啊!

如果有乱码问题,可以参考:http://hi.baidu.com/setcookie/item/ae43ea14403d29f9dceeca3a

后来补充了一个从数据库生成CSV文件的代码:

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.Properties; import au.com.bytecode.opencsv.CSVReader;
import au.com.bytecode.opencsv.CSVWriter; public class Main { /**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception
{
testexportcsv();
}
private static void testexportcsv() throws IOException, SQLException, ClassNotFoundException
{
//当前目录
String v_path=Main.class.getResource("/").getPath()+"dsideal_config.properties"; //读取配置信息
String driverClass = readValue(v_path, "driverClass");
String jdbcUrl=readValue(v_path, "jdbcUrl");
String user=readValue(v_path, "user");
String password=readValue(v_path, "password");
File tempFile = new File("c:/allbill.csv");
// 加载驱动程序
Class.forName(driverClass);
// 连续数据库
Connection conn = DriverManager.getConnection(jdbcUrl, user, password);
if(!conn.isClosed())
{
//生成 UTF-8格式的CSV文件
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(tempFile),"UTF-8");
// statement用来执行SQL语句
Statement stmt= conn.createStatement();
// 要执行的SQL语句
String sql = "select * from t_resource_structure";
ResultSet rs = stmt.executeQuery(sql);
CSVWriter writer = new CSVWriter(osw,',');
writer.writeAll(rs, false);
writer.close();
rs.close();
stmt.close();
}
conn.close(); //测试一下读取
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(tempFile.getAbsolutePath()),"UTF-8"));
CSVReader reader = new CSVReader(br);
List<String[]> myEntries = reader.readAll();
System.out.println(myEntries.get()[].toString());
reader.close();
} //根据key读取value
public static String readValue(String filePath,String key) {
Properties props = new Properties();
try {
InputStream in = new BufferedInputStream (new FileInputStream(filePath));
props.load(in);
String value = props.getProperty (key);
return value;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

在Sqlite中我们可以使用Replace into 的方法进行更新,参考:

http://www.cnblogs.com/liping13599168/archive/2011/05/24/2054908.html

java连接mysql批量写入数据的更多相关文章

  1. .NET 5/.NET Core使用EF Core 5连接MySQL数据库写入/读取数据示例教程

    本文首发于<.NET 5/.NET Core使用EF Core 5(Entity Framework Core)连接MySQL数据库写入/读取数据示例教程> 前言 在.NET Core/. ...

  2. MySQL 批量写入数据报错:mysql_query:Lost connection to MySQL server during query

    场景: 批量往mysql replace写入数据时,报错. 解决方法: 1.增大mysql 数据库配置中 max_allowed_packet 的值 max_allowed_packet = 1G ( ...

  3. java连接mysql

    Java 连接 MySQL 需要驱动包,最新版下载地址为:http://dev.mysql.com/downloads/connector/j/,解压后得到jar库文件,然后在对应的项目中导入该库文件 ...

  4. java连接mysql数据库详细步骤解析

    java连接mysql数据库详细步骤解析      第一步:下载一个JDBC驱动包,例如我用的是:mysql-connector-java-5.1.17-bin.jar      第二步:导入下载的J ...

  5. Java连接MySQL数据库及简单操作代码

    1.Java连接MySQL数据库 Java连接MySql需要下载JDBC驱动MySQL-connector-java-5.0.5.zip(举例,现有新版本).然后将其解压缩到任一目录.我是解压到D盘, ...

  6. 转载:Java连接MySQL 数据库的正确操作流程

    转载网址:http://www.bitscn.com/pdb/mysql/201005/186551.html       以下的文章主要介绍的是Java连接MySQL 数据库(以MySQL数据库为例 ...

  7. Java连接MySQL数据库增删改查通用方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类 ...

  8. 【JDBC】Java 连接 MySQL 基本过程以及封装数据库工具类

    一. 常用的JDBC API 1. DriverManager类 : 数据库管理类,用于管理一组JDBC驱动程序的基本服务.应用程序和数据库之间可以通过此类建立连接.常用的静态方法如下 static ...

  9. Java进阶(二十五)Java连接mysql数据库(底层实现)

    Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...

随机推荐

  1. android操作SQLite

    一.SQLite SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是: NULL: 空值 INTEGER: 整数 REAL: 浮点数 TEXT: 字符串 BLOB: 大数据 ...

  2. Garlands

    题意: n个数分成m段,每段偶数个数,最小化和最大段的半个区间的数字和. 分析: 先想到了二分,dp求能分成的最小段数. #include <map> #include <set&g ...

  3. Dzz任务板初版完成笔记-仿trello私有部署的一款轻量团队任务协作工具。

    刚完成了第一个版本Dzz任务板的设计开发,记录下设计思路和完成情况. Dzz任务板是DzzOffice中的团队协作套件中的一款应用,它需要安装在DzzOffice中使用. 主界面中需要能够快速简单的创 ...

  4. CH340在STM32实现一键下载电路

    在做基于STM32的多功能MP3播放器的课题时,在程序下载这部分时借鉴了正点原子开发板上的一键下载电路,采用CH340G这款芯片设计. 在画PCB初期原理图部分,对采用CH340G设计的一键下载电路不 ...

  5. 【LeetCode】107 - Binary Tree Level Order Traversal II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  6. stringstream实例

    stringstream的具体作用稍后来总结,这里分享一个实例,从txt文档中读取数据,并对进行处理. #include <iostream> #include <sstream&g ...

  7. STL map 用法

    首先make_pair Pairs C++标准程序库中凡是"必须返回两个值"的函数, 也都会利用pair对象  class pair可以将两个值视为一个单元.容器类别map和mul ...

  8. 14个超赞的响应式HTML5模板免费下载

    现在HTML5已经势不可挡.很多朋友开始学习HTML5,当你已经学习过一些HTML5的教程之后,是不是想立即开始实战了呢?对,现在就开始吧,不过 找一些优秀的HTML5模板案例练习是相当不错的注意.当 ...

  9. Ubuntu关闭图形界面

    方法一 sudo /etc/init.d/lightdm stop 方法二 init 3 关闭图形界面 init 5 开启图形界面

  10. SQL时间第一期_获取系统年月日时分秒

    select GETDATE() as '当前日期',DateName(year,GetDate()) as '年',DateName(month,GetDate()) as '月',DateName ...