亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java jdbc批量多線程如何讀取CVS文件入庫

發布時間:2021-10-13 14:28:45 來源:億速云 閱讀:141 作者:柒染 欄目:編程語言

這期內容當中小編將會給大家帶來有關Java jdbc批量多線程如何讀取CVS文件入庫,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

需求是這樣的:現在需要測試一個內存數據庫的入庫性能,要求測試每線程準備一個文件,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 = null;    boolean flag = false;    Statement pre = null;    String sql = "";    TableDataInfo tableInfo = new TableDataInfo();    try {      if(conn == null) {        conn = dbutil.getConnection();      }      pre = conn.createStatement();      conn.setAutoCommit(false);      int colCount = tableInfo.getTableColNums(tablename, conn);      int rowCount = 0;      File file = new File(filePath);      BufferedReader buf = null;      buf = new BufferedReader(new InputStreamReader(new FileInputStream(file)));      String line_record = buf.readLine();      long startTime = System.currentTimeMillis(); //開始計時      while (line_record != null) {        // 解析每一條記錄        sql = "INSERT INTO " + tablename + " VALUES('";        String[] fields = line_record.split(DELIMITERS);        //對Insert語句的合法性進行判斷        if(fields.length != colCount){          System.out.println("要插入的數據列數和表的數據列不相匹配,停止執行");          break;        }        for (int i = 0; i < fields.length; i++) {          sql += fields[i];          if (i < fields.length - 1) {            sql += "','";          }        }        sql += "');";        // 在控制臺輸出SQL語句        // System.out.println(sql);        //執行SQL語句        pre.addBatch(sql);        rowCount++;        line_record = buf.readLine();        if (rowCount >= rc) {          break;        }      }      pre.executeBatch();      conn.setAutoCommit(true);      pre.close();      System.out.println("共寫入行數:" + rowCount);      long endTime = System.currentTimeMillis(); //停止計時      System.out.println("執行時間為:" + (endTime - startTime) + " ms");    } catch (Exception e) {      flag = false;      try {        //回滾        if(conn != null) {          conn.rollback();        }      } catch (SQLException e1) {        e1.printStackTrace();      }      e.printStackTrace();    } finally {      dbutil.close(null, pre, conn);    }    return flag;  }  public void run() {    this.insertDB(tableName, 500000, filePath);  }}

import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.ResultSet;import java.sql.SQLException;/** * @param * @author wu.lin * @description 數據庫表實體 * @create 2016年09月01日 14:19 * @throws */public class TableDataInfo {  DBUtil dbutil = DBUtil.getInstance();  /**   *   * @param m_TableName   * @param m_Connection   * @return 該表的列數   */  public int getTableColNums(String m_TableName, Connection m_Connection) {    int colCount = 0;    try {      if (m_Connection == null) {        m_Connection = dbutil.getConnection();      }      DatabaseMetaData m_DBMetaData = m_Connection.getMetaData();      ResultSet tableRet = m_DBMetaData.getTables(null, "%", m_TableName,          new String[] { "TABLE" });      while (tableRet.next()) {        System.out.println("Table name is:"            + tableRet.getString("TABLE_NAME"));      }      String columnName;      String columnType;      ResultSet colRet = m_DBMetaData.getColumns(null, "%", m_TableName,"%");      while (colRet.next()) {        columnName = colRet.getString("COLUMN_NAME");        columnType = colRet.getString("TYPE_NAME");        int dataSize = colRet.getInt("COLUMN_SIZE");        int digits = colRet.getInt("DECIMAL_DIGITS");        int nullable = colRet.getInt("NULLABLE");        String nullFlag;        if (nullable == 1) {          nullFlag = "Null";        } else {          nullFlag = "Not Null";        }        System.out.println(columnName + " " + columnType + "("            + dataSize + "," + digits + ") " + nullFlag);        colCount++;      }    } catch (SQLException e) {      e.printStackTrace();    }    System.out.println("The number of column is: " + colCount);    return colCount;  }}

接下來就剩下讀取配置文件的代碼了,先來看看配置文件內容(這里配置了數據庫配置文件路徑表名以及文件存放的相對路徑):

<?xml version="1.0" encoding="utf-8" ?><config>  <db_file>src/dbconfig.properties</db_file>  <tableName>memtest</tableName>  <files>    <filePath>files/memtest.csv</filePath>    <filePath>files/memtest_1.csv</filePath>    <filePath>files/memtest_2.csv</filePath>    <filePath>files/memtest_3.csv</filePath>    <filePath>files/memtest_4.csv</filePath>    <filePath>files/memtest_5.csv</filePath>    <filePath>files/memtest_6.csv</filePath>    <filePath>files/memtest_7.csv</filePath>    <filePath>files/memtest_8.csv</filePath>    <filePath>files/memtest_9.csv</filePath>    <filePath>files/memtest_10.csv</filePath>  </files></config>

接下來是讀取這個配置文件的內容,比較簡單,所以只貼部分代碼:

import javax.xml.parsers.*;import org.w3c.dom.*;import java.io.*;import java.util.ArrayList;/** * @param * @author wu.lin * @description 讀取配置信息 * @create 2016年09月01日 15:45 * @throws */public class XMLUtil {  //該方法用于從XML配置文件中提取要插入的表名稱,并返回該表名稱  public static String getTableName() {    return getXmlProperties("tableName");  }  public static String getDatabaseUrl() {    return getXmlProperties("dataBaseUrl");  }  public static String getDbFilePath() {    return getXmlProperties("db_file");  }  private static String getXmlProperties(String proName) {    try {      Document doc = getDoc();      //獲取包含品牌名稱的文本節點      NodeList nl = doc.getElementsByTagName(proName);      Node classNode=nl.item(0).getFirstChild();      String tableName=classNode.getNodeValue().trim();      return tableName;    } catch(Exception e)    {      e.printStackTrace();      return null;    }  }  private static Document getDoc() throws Exception {    //創建文檔對象    DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();    DocumentBuilder builder = dFactory.newDocumentBuilder();    Document doc;    doc = builder.parse(new File("src/config.xml"));    return doc;  }}

數據庫配置信息文檔:

db.used=mysql# driver classoracle.jdbc.driver_class=oracle.jdbc.driver.OracleDriver# URLoracle.jdbc.url=jdbc:oracle:thin:@localhost:1521:ORCL# usernameoracle.jdbc.username=scott# pwdoracle.jdbc.pwd=tiger#mysql connect configmysql.jdbc.driver_class=com.mysql.jdbc.Drivermysql.jdbc.url=jdbc:mysql://localhost:3306/mysqldbmysql.jdbc.username=rootmysql.jdbc.pwd=

最后是數據庫幫助類,比較常見:

import java.io.FileInputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;/** * @param * @author wu.lin * @description 數據庫幫助類 * @create 2016年09月01日 18:56 * @throws */public class DBUtil {  private static Properties env = new Properties();  private static DBUtil dbutil;  private static String dbname;  private static String driverClass_key;  private static String url_key;  private static String username_key;  private static String pwd_key;  private DBUtil(){}  // 單例模式  public static synchronized DBUtil getInstance() {    if (null == dbutil) {      dbutil = new DBUtil();    }    return dbutil;  }  /**   * 得到數據庫連接   * @return   */  public Connection getConnection() {    Connection conn = null;    try {      env.load(new FileInputStream(XMLUtil.getDbFilePath()));      dbname = env.getProperty("db.used").toLowerCase();      driverClass_key = dbname + ".jdbc.driver_class";      url_key = dbname + ".jdbc.url";      username_key = dbname + ".jdbc.username";      pwd_key = dbname + ".jdbc.pwd";      //加載連接數據庫的驅動程序類文件      Class.forName(env.getProperty(driverClass_key));      conn = createConnection();    } catch (Exception e) {      e.printStackTrace();    }    return conn;  }  private Connection createConnection() throws SQLException {    Connection conn = null;    if ("oracle".equals(dbname)) {      conn = DriverManager.getConnection(env.getProperty(url_key), env.getProperty(username_key),          env.getProperty(pwd_key));    }    if ("sqlserver".equals(dbname)) {      conn = DriverManager.getConnection(env.getProperty(url_key), env.getProperty(username_key),          env.getProperty(pwd_key));    }    if ("mysql".equals(dbname)) {      // 其他數據庫的連接語法      String url = env.getProperty(url_key);      String username = env.getProperty(username_key);      String pwd = env.getProperty(pwd_key);      if(username != null && !"".equals(username)) {        url += ("?user=" + username);        if(pwd != null && !"".equals(pwd)) {          url += ("&password=" + pwd);        }      }      conn = DriverManager.getConnection(url);    }    return conn;  }  //提供jdbc關閉連接的方法  public void close(ResultSet rs,Statement st,Connection conn){    try {      if(rs!=null)        rs.close();      if(st!=null)        st.close();      if(conn!=null)        conn.close();    } catch (SQLException e) {      e.printStackTrace();    }  }}

最后的工作便是在文件目錄存放相應的數據文件,然后通過配置文件配置好文件名、表名以及數據庫連接的基本信息后,運行程序入口,便可以將程序跑起來啦。但是在這個過程中也遇到一些小問題,比如,我這邊只有一個100w條數據的.csv格式的文件,但是要求讀取十個文件,在這個時候我用到了一個小工具:

大家知道.csv格式的文件也可以用Excel軟件打開,所以在這里轉換一下用Excel分割器把文件分成十份,就完美的解決問題啦。

上述就是小編為大家分享的Java jdbc批量多線程如何讀取CVS文件入庫了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

双峰县| 广昌县| 赣州市| 天气| 武邑县| 泉州市| 柘荣县| 将乐县| 闸北区| 巴林左旗| 潢川县| 齐齐哈尔市| 沈阳市| 通渭县| 平阴县| 迁西县| 邵阳市| 昌平区| 武夷山市| 休宁县| 沅陵县| 兴海县| 石柱| 高尔夫| 柯坪县| 乐昌市| 辉县市| 乌拉特后旗| 乌审旗| 黄陵县| 临邑县| 三门县| 丹寨县| 达拉特旗| 松原市| 子洲县| 东兰县| 延边| 神农架林区| 通河县| 社旗县|