Java jdbc批量多线程读取CVS文件入库

  

需求是这样的:现在需要测试一个内存数据库的入库性能,要求测试每线程准备一个文件,10个线程入库总计100 w记录数的单表入库性能。

  

知识点:jdbc +多线程+批处理+文件读取

  

先来看看我的代码结构

  

癑ava

  

<强>说明:

  

文件:存放即将要读取的文件。
  自由:存放第三方的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文件入库