怎么实现,java读1G以上的txt文件并快速入库?

时间:2021-08-27 14:16:36
txt文件每行数据需要入库,有1千多万条数据,其中每行字段用的是逗号隔开

我的代码是:读一条入一条 这样太慢了,

请问有什么好的方法实现,麻烦付上代码,谢谢!

4 个解决方案

#1


我也是这样做的,没什么好办法,入库的速度和数据库性能有关。否则的话,用数据库的导入命令来做,那样很快。

#2


用mysql数据库的load data infile语句应该很快

#3


用程序读这么大的文件,是比较慢的

#4


可以读好几条然后一次写入数据库的,如果你有导出oracle数据习惯的话,会发现oracle导出的sql会100条sql语句使用一个commit的,显然比一条sql语句插入一次效率要高。
以下代码可以借鉴下:

Connection con = null;
   Statement stm = null;
   try {
    con = JDBCConAndClo.getConnectionBao();
    stm = con.createStatement();
    con.setAutoCommit(false);
    // 若不出现异常,则继续执行到try语句完,否则跳转到catch语句中
    stm.addBatch("insert into student values(23,'tangbao','高数',100)");
    stm.addBatch("insert into student values(24,'王定','c#',98)");
    stm.addBatch("insert into student values(25,'王国云','java',90)");
    stm.addBatch("insert into student values(26,'溜出','英语',89)");
    stm.addBatch("insert into student values(27,'wqde','java',63)");
    /*
    * int[] executeBatch() throws
    * SQLException将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
    */
    stm.executeBatch();
    System.out.println("插入成功!");
    // commit:若成功执行完所有的插入操作,则正常结束
    con.commit();
    System.out.println("提交成功!");
    con.setAutoCommit(true);

   } catch (SQLException e) {
    e.printStackTrace();
    try {
//rollback: 若出现异常,对数据库中所有已完成的操作全部撤销,则回滚到事务开始状态
     if (!con.isClosed()) {
      con.rollback();
      System.out.println("提交失败,回滚!");
      con.setAutoCommit(true);
     }
    } catch (SQLException e1) {
     e1.printStackTrace();
    } finally {
     JDBCConAndClo.closeStatement(stm);
     JDBCConAndClo.closeConnection(con);
    }
   }


#1


我也是这样做的,没什么好办法,入库的速度和数据库性能有关。否则的话,用数据库的导入命令来做,那样很快。

#2


用mysql数据库的load data infile语句应该很快

#3


用程序读这么大的文件,是比较慢的

#4


可以读好几条然后一次写入数据库的,如果你有导出oracle数据习惯的话,会发现oracle导出的sql会100条sql语句使用一个commit的,显然比一条sql语句插入一次效率要高。
以下代码可以借鉴下:

Connection con = null;
   Statement stm = null;
   try {
    con = JDBCConAndClo.getConnectionBao();
    stm = con.createStatement();
    con.setAutoCommit(false);
    // 若不出现异常,则继续执行到try语句完,否则跳转到catch语句中
    stm.addBatch("insert into student values(23,'tangbao','高数',100)");
    stm.addBatch("insert into student values(24,'王定','c#',98)");
    stm.addBatch("insert into student values(25,'王国云','java',90)");
    stm.addBatch("insert into student values(26,'溜出','英语',89)");
    stm.addBatch("insert into student values(27,'wqde','java',63)");
    /*
    * int[] executeBatch() throws
    * SQLException将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
    */
    stm.executeBatch();
    System.out.println("插入成功!");
    // commit:若成功执行完所有的插入操作,则正常结束
    con.commit();
    System.out.println("提交成功!");
    con.setAutoCommit(true);

   } catch (SQLException e) {
    e.printStackTrace();
    try {
//rollback: 若出现异常,对数据库中所有已完成的操作全部撤销,则回滚到事务开始状态
     if (!con.isClosed()) {
      con.rollback();
      System.out.println("提交失败,回滚!");
      con.setAutoCommit(true);
     }
    } catch (SQLException e1) {
     e1.printStackTrace();
    } finally {
     JDBCConAndClo.closeStatement(stm);
     JDBCConAndClo.closeConnection(con);
    }
   }