需求是这样的:现在需要测试一个内存数据库的入库性能,要求测试每线程准备一个文件,10个线程入库总计100w记录数的单表入库性能。
知识点:jdbc + 多线程 + 批处理 + 文件读取
先来看看我的代码结构
说明:
files: 存放即将要读取的文件。
lib: 存放第三方的jar文件,例如数据库驱动包。
MemSqlTestMain: 这是工程的入口,就是主程序。
DBUtil: 这个类是数据库帮助类,主要读取数据库配置信息获取连接关闭连接等操作。
InsertUtil: 主要做的是读取数据文件生成sql并批量入库的一个类。
TableDataInfo: 主要对要插入的数据表的对象的一个类。
XMLUtil: 读取XML配置文件
config.xml: 配置要插入的表信息以及文件的路径等信息
dbconfig.properties: 主要对数据库的连接信息进行存储,包括URL,用户名密码等等。
话不多说直接上代码:
import java.util.ArrayList;
/**
* @param
* @author wu.lin
* @description 程序入口,启用线程读取文件并入库
* @create 2016年09月01日 15:12
* @throws
*/
public class MemSqlTestMain {
public static void main(String[] args) {
//通过读取配置文件读取要插入数据的表名
String tableName = XMLUtil.getTableName();
System.out.println(tableName);
//通过配置文件读取数据存放的文件的路径
ArrayList<String> fileNameList = XMLUtil.getFileNameList();
int len = fileNameList.size();
//针对每一个文件开启一个进程去执行读取并入库的操作
for (int i = 0; i < len; i++) {
String fileName = fileNameList.get(i);
System.out.println(fileName);
new Thread(new InsertUtil(fileName, tableName)).start();
}
}
}
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.sql.*;
/**
* @param
* @author wu.lin
* @description InsertUtil是一个线程类,主要读取数据文件组装Sql并执行入库操作
* @create 2016年09月01日 14:10
* @throws
*/
public class InsertUtil implements Runnable {
//文件路径
private String filePath;
//表名
private String tableName;
//.cvs文件数据以","分隔
private static String DELIMITERS = ",";
//获取数据库帮助类
DBUtil dbutil = DBUtil.getInstance();
public InsertUtil() {}
public InsertUtil(String filePath, String tableName) {
this.filePath = filePath;
this.tableName = tableName;
}
public static String getDELIMITERS() {
return DELIMITERS;
}
public static void setDELIMITERS(String delimiters) {
DELIMITERS = delimiters;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
//读取文件并且批处理入库的方法
public boolean insertDB(String tablename, long rc, String filePath) {
if(filePath == null || "".equals(filePath)) {
System.out.println("文件路径为空");
return false;
}
if (rc < 1) {
rc = 100;
}
Connection conn =