需求是这样的:现在需要测试一个内存数据库的入库性能,要求测试每线程准备一个文件,10个线程入库总计100 w记录数的单表入库性能。
知识点:jdbc +多线程+批处理+文件读取
先来看看我的代码结构
<强>说明:强>
文件:存放即将要读取的文件。
自由:存放第三方的jar文件,例如数据库驱动包。
MemSqlTestMain:这是工程的入口,就是主程序。
DBUtil:这个类是数据库帮助类,主要读取数据库配置信息获取连接关闭连接等操作。
InsertUtil:主要做的是读取数据文件生成sql并批量入库的一个类。
TableDataInfo:主要对要插入的数据表的对象的一个类。
XMLUtil:读取XML配置文件
配置。xml:配置要插入的表信息以及文件的路径等信息
dbconfig。属性:主要对数据库的连接信息进行存储,包括URL,用户名密码等等。
话不多说直接上代码:
进口java.util.ArrayList;/* * * @param * @author wu.lin * @description程序入口,启用线程读取文件并入库 * @create 2016年09月01日十五12 * @throws */公开课MemSqlTestMain { 公共静态void main (String [] args) {//通过读取配置文件读取要插入数据的表名 字符串表=XMLUtil.getTableName (); System.out.println(表);//通过配置文件读取数据存放的文件的路径 ArrayListfileNameList=XMLUtil.getFileNameList (); int len=fileNameList.size ();//针对每一个文件开启一个进程去执行读取并入库的操作 for (int i=0;我& lt;兰;我+ +){ 字符串文件名=fileNameList.get(我); System.out.println(文件名); 新线程(新InsertUtil(文件名、表名)).start (); } } }
进口java.io.BufferedReader; 进口java.io.File; 进口java.io.FileInputStream; 进口java.io.InputStreamReader; 进口java.sql。*;/* * * @param * @author wu.lin * @description InsertUtil是一个线程类,主要读取数据文件组装Sql并执行入库操作 * @create 2016年09月01日14:10 * @throws */公共类InsertUtil实现Runnable {//文件路径 私人字符串filePath;//表名 私人字符串表;//.cvs文件数据以”、“分隔 私有静态字符串分隔符="、";//获取数据库帮助类 DBUtil DBUtil=DBUtil.getInstance (); 公共InsertUtil () {} filePath公共InsertUtil(字符串,字符串表){ 这一点。filePath=filePath; 这一点。表名=表; } 公共静态字符串getDELIMITERS () { 返回分隔符; } 公共静态孔隙setDELIMITERS(字符串分隔符){ 分隔符=分隔符; } 公共字符串getFilePath () { 返回filePath; } 公共空间setFilePath(字符串filePath) { 这一点。filePath=filePath; }//读取文件并且批处理入库的方法 公共布尔insertDB(字符串表、长rc字符串filePath) { 如果(filePath==null | |”“.equals (filePath)) { System.out.println(“文件路径为空"); 返回错误; } 如果(rc & lt;1){ rc=100; } 连接康涅狄格州=零; 布尔标志=false; 声明前=零; 字符串sql=" "; TableDataInfo tableInfo=new TableDataInfo (); 尝试{ 如果(康涅狄格州==null) { 康涅狄格州=dbutil.getConnection (); } pre=conn.createStatement (); conn.setAutoCommit(假); int colCount=tableInfo。康涅狄格州getTableColNums(表); int rowCount=0; 文件文件=新文件(filePath); BufferedReader buf=零; buf=new BufferedReader(新InputStreamReader(新FileInputStream(文件))); 字符串line_record=buf.readLine (); 长时间的开始时间=System.currentTimeMillis ();//开始计时 而(line_record !=null) {//解析每一条记录 sql="插入" +表名+”值(’”; String[]字段=line_record.split(分隔符);//对插入语句的合法性进行判断 如果字段。长度!=colCount) { System.out.println(“要插入的数据列数和表的数据列不相匹配,停止执行”); 打破; } for (int i=0;我& lt;fields.length;我+ +){ sql +=字段(我); 如果我& lt;字段。长度- 1){ sql +=啊薄ⅰ啊? } } sql +=薄?;;//在控制台输出SQL语句//System.out.println (sql);//执行SQL语句 pre.addBatch (sql); rowCount + +; line_record=buf.readLine (); 如果(rowCount祝辞=rc) { 打破; } } pre.executeBatch (); conn.setAutoCommit(真正的); pre.close (); system . out。println(“共写入行数:“+ rowCount); 长endTime=System.currentTimeMillis ();//停止计时 system . out。println(“执行时间为:" + (endTime -开始时间)+“女士”); }捕捉(异常e) { 国旗=false; 尝试{//回滚 如果(康涅狄格州!=null) { conn.rollback (); } }捕捉(SQLException e1) { e1.printStackTrace (); } e.printStackTrace (); 最后}{ dbutil。关闭(康涅狄格州null, pre); } 返回国旗; } 公共空间run () { 这一点。insertDB(表名,500000年,filePath); } }Java jdbc批量多线程读取CVS文件入库