1、 jdbd采用批处理插入大量数据,速度还是相当的慢,一个拥有一个自增字段、三个字符串字段的表,往里面插入1W条数据消耗一分多钟。代码如下:
public class DBbatchdeal {
/**
*
* @param conn jdbc链接
* @param tableName 表明
* @param lists 数据集
* @param n 每行字段个数 出去自增字段
* @param flag 第一列是否自增字段
* @return 是否成功
*/
public boolean deal(Connection conn,String tableName,ArrayList<String[]> lists ,int n,boolean flag){
StringBuffer sql = new StringBuffer();
sql.append("insert into ").append(tableName)
.append(" values(");
sql=(flag==true?sql.append("null ,"):sql);
for(int i=0;i<n-1;i++){
sql.append("?, ");
}
sql.append("?);");
int size=lists.size();
int m= (true==flag?n-1:n);
PreparedStatement preStmt=null;
long a=System.currentTimeMillis();
try {
preStmt = conn.prepareStatement(sql.toString(),ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
for(int j=0;j<size;j++){
String[] str=lists.get(j);
for(int k=0;k<n;k++){
preStmt.setString(k+1, str[k]);
}
preStmt.addBatch();
if(j%100==0){
preStmt.executeBatch();
preStmt.clearBatch();
}
}
preStmt.executeBatch();
}
catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(null!=preStmt){
preStmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
long b=System.currentTimeMillis();
System.out.println("插入"+size+"条数据所需要的时间:"+(b-a));
return true;
}
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://ip***/db", "root", "pwd");
DBbatchdeal deal=new DBbatchdeal();
ArrayList<String[]> lists =new ArrayList<String[]>();
for(int i=0;i<10000;i++){
String[] str={"1307"+i,"passwd"+i,"20130709121212"};
lists.add(str);
}
deal.deal(conn, "testTable", lists, 3, true);
}
}
2、因为上面的方法处理的较慢,又想了个较为麻烦点儿的方式,用mysql的load data来导入数据。具体就是写段导入数据的脚本用java来执行,测试了下1w条记录插入的时间还是相当短的。
结果如下:
Java2Sh内容如下:
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class Java2Sh {
/**
* 对文件进行赋权
* @param infile 文件全路径
* @return runtime执行返回码
*/
public int chmodrun(String infile) {
int retCode = 0;
try {
Runtime rtime = Runtime.getRuntime();
Process child = rtime.exec("chmod 777 " +infile);
retCode=child.waitFor();
System.out.println("chmod :"+retCode);
}
catch (Exception e) {
System.out.println("chmod failed "+infile);
e.printStackTrace();
}
return retCode;
}
/**
*执行脚本文件
* @param infile 文件全路径
* @return runtime执行返回码
*/
public int shellFile(String infile) {
int retCode = 0;
try {
Runtime rtime = Runtime.getRuntime();
Process child = rtime.exec("sh " +infile);
retCode=child.waitFor();
System.out.println("shell file :"+retCode);
}
catch (Exception e) {
System.out.println("shell file failed "+infile);
e.printStackTrace();
}
return retCode;
}
public void writeData() throws IOException{//生成mysql2.txt
String str="13311122,passwds,20130710235959";
BufferedWriter out =new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("D:\\mysql2.txt"))));
for(int i=0;i<10000;i++){
out.write(str);
out.write("\n");
}
out.flush();
out.close();
}
public static void main(String[] args) throws IOException {
Java2Sh j2=new Java2Sh();
long a=System.currentTimeMillis();
j2.chmodrun("/shh.sh");
j2.shellFile("/shh.sh");
long b=System.currentTimeMillis();
System.out.println("==========="+(b-a));
// j2.writeData();
}
}
其中shh.sh内容为:
mysql -h localhost -u root -ppwd < /loaddata.sql > /dblog
loaddata.sql内容为:
use dbname;
LOAD DATA INFILE '/mysql2.txt' INTO TABLE testTable FIELDS TERMINATED BY ',' (cardnum,cardpwd,times);
commit;
介于个人水平,贴出来仅供参考,欢迎告诉我更简便高效的方式,先谢过了。
分享到:
相关推荐
这在处理大量数据时可能较慢,但提供了更大的灵活性和错误处理能力。 3. **第三方工具**:一些数据库管理工具如MySQL Workbench、Navicat等也提供了导入数据的功能,通过图形化界面可以方便地配置导入参数。 在...
### MySQL与Java数据类型对应详解 #### 概述 在进行数据库操作时,尤其是在使用Java进行MySQL数据库开发的过程中,正确地映射数据类型是至关重要的一步。本文将详细介绍MySQL中的各种数据类型及其在Java中的对应...
Java 和 MySQL 数据类型之间的对比是理解数据库操作和应用程序开发中数据处理的关键。这两种语言的数据类型在功能和使用上都有所不同,尽管它们都用于存储和处理数据,但各自有着特定的适用场景和特点。 首先,Java...
MySQL Connector/J 8.0.2 是MySQL数据库与Java应用程序之间的关键桥梁,它是一个驱动程序,使得Java开发者能够使用JDBC(Java Database Connectivity)接口连接到MySQL服务器。MySQL是世界上最受欢迎的关系型数据库...
在Java编程中,有时我们需要将图片等大容量的二进制数据存储到数据库中,MySQL提供了BLOB(Binary Large Object)类型,专门用于存储大块的二进制数据。本实例将详细介绍如何使用Java和MySQL进行图片的存取操作。 ...
总结来说,MySQL Connector/J 8.0.11是一个强大的Java数据库连接驱动,它使得Java开发者可以方便、高效地与MySQL数据库进行交互,尤其适用于那些需要处理大量数据、对性能有高要求的Java应用。同时,其兼容性和安全...
在Java Web开发中,当数据量较大时,为了提高用户体验,通常会采用分页的方式来展示数据。本示例"java-web-mysql 分页demo"提供了一个完整的Java Web应用程序,它结合了MySQL数据库进行分页查询,通过SQL文件hh_2018...
在Java编程中,连接数据库是应用程序的基础部分,特别是在处理动态数据或者需要持久化存储的场景下。MySQL Connector/J提供了一套完整的API,允许开发者执行SQL语句、管理事务、处理结果集等操作。它通过Java的...
在IT领域,特别是软件开发与数据库管理中,Java与MySQL之间的数据类型映射是一个至关重要的知识点,它确保了数据在不同平台间能够准确无误地转换与存储。根据提供的文件信息,我们可以深入探讨这一主题,解析Java与...
MySQL Connector/J是MySQL数据库与Java应用程序之间的桥梁,它是一个实现了JDBC(Java Database Connectivity)标准的驱动程序,允许Java开发者在Java应用中访问MySQL数据库。本文将深入探讨MySQL Connector/J的相关...
此外,由于这是一个较旧的版本,对于新的MySQL服务器版本或Java环境,可能需要升级到更现代的驱动版本以获取最新特性和安全更新。 总之,MySQL Connector/J 5.1.18为Java开发者提供了一种高效、可靠的途径,将Java...
MySQL采用SQL(结构化查询语言)作为数据操作的主要接口,这使得它对开发者友好,适用于各种应用程序,从小型网站到大型企业系统。 MySQL数据库的核心特性包括: 1. **事务处理**:支持ACID(原子性、一致性、隔离...
这适用于数据量较小的情况,因为大量数据的SQL脚本执行可能效率较低。 2. **ETL工具**:使用 Extraction, Transformation, Loading (ETL) 工具,如 Talend, Informatica 或者 Oracle Data Integrator,这些工具能够...
在JavaExcel的实践中,当一次性加载大量数据到内存时,确实容易引发`OutOfMemoryError`,这是因为Excel对象模型在内存中的表示占用空间较大。为了解决这个问题,我们需要采用流式处理或者分批处理的策略。在描述中...
3. **MySQL**: MySQL是世界上最受欢迎的关系型数据库管理系统之一,特别适合处理大量数据。在这个电商项目中,MySQL可能用于存储用户信息、商品详情、订单数据等。开发者可能使用了MyBatis的SQL映射文件来执行CRUD...
3. 结果集处理:通过`java.sql.ResultSet`对象处理查询返回的数据。 4. 事务管理:支持开始、提交和回滚数据库事务。 5. 数据源配置:通过`javax.sql.DataSource`接口实现更高级的连接池管理,提高性能和资源利用率...
在Java应用程序开发过程中,经常遇到的一个问题就是内存溢出错误,特别是在处理大量数据或长时间运行的应用时。其中,“java.lang.OutOfMemoryError: Java heap space”是一种常见的异常情况,它表明Java虚拟机(JVM)...
Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...
4. **性能优化**:尽管比8.0版本稍旧,但仍进行了一些性能优化,特别是在高并发和大数据量操作时。 5. **改进的错误处理**:提供了更丰富的错误信息,帮助开发者调试问题。 6. **部分JSON支持**:虽然不完全支持JSON...