700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > JAVA从文本文件(txt)读取一百万条数据保存到数据库

JAVA从文本文件(txt)读取一百万条数据保存到数据库

时间:2024-04-04 07:39:07

相关推荐

JAVA从文本文件(txt)读取一百万条数据保存到数据库

Java读取大文本文件保存到数据库

1、追求效率

将文件读取到内存,效率比较高,经过测试读取1G左右的文本文件,机器内存消耗达到接近3个G,对内存消耗太大,不建议使用

2、通过调用第三方类库实现

通过开源的Apache Commons IO类库提供的LineIterator对每行数据读取,底层通过jdk中提供的BufferedReader实现,对内存的开销不是很大

3、具体实现步骤

创建java项目引入pom依赖

1 <!-- /artifact/commons-io/commons-io -->2 <dependency>3 <groupId>commons-io</groupId>4 <artifactId>commons-io</artifactId>5 <version>2.4</version>6 </dependency>7 <!-- /artifact/ojdbc/ojdbc -->8 <dependency>9 <groupId>ojdbc</groupId>10 <artifactId>ojdbc</artifactId>11 <version>14</version>12 </dependency>

具体实现代码

1 package com.sun.file;2 3 import java.io.File;4 import java.io.IOException;5 import java.sql.Connection;6 import java.sql.DriverManager;7 import java.sql.PreparedStatement;8 import java.sql.SQLException;9 import java.util.Date;10 11 import mons.io.FileUtils;12 import mons.io.LineIterator;13 14 public class ReadCustomerFile {1516int idx;17Connection conn = null;18PreparedStatement pstmt = null; 1920/**21* 使用commons-io.jar包的FileUtils的类进行读取22* txt中内容文件的分割必须为|,java中需要加转译符号23* @Title: readTxtFileByFileUtils 24* @author sunt 25* @date 11月13日26* @return void27*/28public void readTxtFileByFileUtils(String fileName) {29 File file = new File(fileName);30 31 dbConnection();32 33 try {34 LineIterator lineIterator = FileUtils.lineIterator(file, "UTF-8");35 while (lineIterator.hasNext()) {36 String line = lineIterator.nextLine();37 38 // 行数据转换成数组39 String[] custArray = line.split("\\|");40 insertCustInfo(custArray,"SQLLOADER");41 Thread.sleep(10);42 }43 } catch (IOException e) {44 e.printStackTrace();45 } catch (InterruptedException e) {46 e.printStackTrace();47 } finally {48 dbDisConnection();49 }50}5152 /**53* 数据入库的逻辑需要自己实现54* sqlBf.append("INSERT INTO TEMP_CUST_INFO(CUST_NO, CUST_NM, MOB_NO1)\n");55 sqlBf.append("VALUES(? \n");56 sqlBf.append(", ? \n");57 sqlBf.append(", ?) \n");58 59 拼接sql最后结尾的括号不能丢失60* @Title: insertCustInfo 61* @author sunt 62* @date 11月13日63* @return void64*/65public void insertCustInfo(String[] strArray,String tableName) { 66 try {67 StringBuffer sqlBf = new StringBuffer();68 sqlBf.setLength(0);69 70 sqlBf.append("INSERT INTO "+tableName+"(ID, NAME)\n");71 sqlBf.append("VALUES(? \n");72 sqlBf.append(", ?) \n");73 74 pstmt = conn.prepareStatement(sqlBf.toString());75 idx = 1;76 pstmt.clearParameters();77 // pstmt.setInt(idx++, Integer.parseInt(strArray[0]));78 pstmt.setString(idx++, strArray[0]);79 pstmt.setString(idx++, strArray[1]);80 81 pstmt.executeUpdate(); 82 } catch (SQLException e) {83 e.printStackTrace();84 } finally {85 if (pstmt != null) {86 try {87 pstmt.close();88 } catch (SQLException e) {89 e.printStackTrace();90 }91 }92 }93}9495/**96* 连接数据库的基本信息97* @Title: dbConnection 98* @author sunt 99* @date 11月13日100* @return Connection101*/102public Connection dbConnection() {103 try {104 Class.forName("oracle.jdbc.driver.OracleDriver");105 106 String url = "jdbc:oracle:thin:@192.168.40.30:1521:orcl"; 107 String user = "ACTIVITY1"; 108 String password = "ACTIVITY1"; 109 110 conn = DriverManager.getConnection(url, user, password); 111 System.out.println("Connection 开启!");112 } catch (ClassNotFoundException e) {113 e.printStackTrace();114 } catch (SQLException e) {115 e.printStackTrace();116 }117 118 return conn;119}11/**122* 关闭数据库的连接123* @Title: dbDisConnection 124* @author sunt 125* @date 11月13日126* @return void127*/128public void dbDisConnection() {129 if (conn != null) {130 try {131 conn.close();132 System.out.println("Connection 关闭!");133 } catch (SQLException e) {134 e.printStackTrace();135 }136 }137}138139//测试代码140public static void main(String[] args) {141 ReadCustomerFile rcf = new ReadCustomerFile();142 Long startTime = new Date().getTime();143 rcf.readTxtFileByFileUtils("F:\\lc_test.txt");144 System.out.println("导入数据总共耗时:" + (new Date().getTime() - startTime)/1000 + "秒");145}146 }

导入的文件模板(大约100百万模拟数据),以|作为分隔符

导入数据库成功

注意事项:

需要修改自己的数据库连接信息和指定导入文本文件的路径,insertCustInfo方法需要自己修改实现

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。