博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java连接mysql批量写入数据
阅读量:5847 次
发布时间:2019-06-18

本文共 5007 字,大约阅读时间需要 16 分钟。

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; 有时间应该试试,据说效果不错啊!

如果有乱码问题,可以参考:

 

后来补充了一个从数据库生成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
myEntries = reader.readAll(); System.out.println(myEntries.get(0)[3].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://cfwjx.baihongyu.com/

你可能感兴趣的文章
js 将json字符串转换为json兑现
查看>>
java读取properties配置文件
查看>>
C/C++语言经典著作
查看>>
分布式文件系统之MogileFS实现
查看>>
qtcreator 错误error:stray'\243'in program
查看>>
工作之命令小总结(7):tail命令
查看>>
LVS+keepalived负载均衡
查看>>
YII分页显示数据
查看>>
Android下获取状态栏的高度
查看>>
Start Developing iOS Apps Today系列(六)
查看>>
UITableview中cell重用引起的内容重复的问题
查看>>
stm32 ADC使用 单通道 多通道
查看>>
Windows服务器配置与管理
查看>>
UVA 10003 Cutting Sticks
查看>>
DRP项目总结
查看>>
图的连通性——无向图的连通分量和生成树
查看>>
Linux安装更新JDK
查看>>
VM10.0上创建Windows server 2008 SP2,并且,安装loadrunner11
查看>>
抽象工厂
查看>>
linux下高可用mysql
查看>>