【问题标题】:Is a "Load DATA" without a file (i.e., in memory) possible for MySQL and Java?MySQL 和 Java 是否可以“加载数据”而没有文件(即在内存中)?
【发布时间】:2011-04-07 08:27:27
【问题描述】:

我正在优化将约 10TB 数据导入 MySQL 数据库的过程。目前,我可以在当前笔记本电脑上大约 14 分钟内导入 2.9GB(+0.8GB 索引)。该过程包括读取数据文件(Oracle“.dat”导出)、解析数据、将数据写入 CSV 文件并对其执行“LOAD DATA LOCAL”sql 命令。

是否可以提高导入速度(无需更改硬件)?有没有办法删除将文件写入文件系统并让 MySQL 再次读取它的步骤。是否可以将内存中的数据直接流式传输到 MySQL(例如,通过 JDBC 驱动程序)?

提前非常感谢, 约尔格。

【问题讨论】:

    标签: java mysql csv load


    【解决方案1】:

    似乎从 MySQL Connector/J JDBC 驱动程序版本 5.1.3 开始,您可以在 Java 代码内部使用 com.mysql.jdbc.Statement.setLocalInfileInputStream() 方法连接 InputStream 引用,以“管道”您的内存中格式化字符串/ 'LOAD DATA INFILE' 调用的文本。这意味着您不必写出并从内存中重新读取临时文件。请参考:

    http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-implementation-notes.html(页面底部)

    post 中也概述了该过程:

    http://jeffrick.com/2010/03/23/bulk-insert-into-a-mysql-database

    O'reilly 产生了a PDF covering MySQL/JDBC performance gems,指的是这个。

    还提到了it's usage with Hadoop(高级Java主题)。

    希望这一切都有帮助。

    干杯

    丰富

    【讨论】:

      【解决方案2】:

      很难找到实际的工作代码,所以这里有一些:

      @Test
      public void bulkInsert() throws SQLException {
          try(com.mysql.jdbc.Connection conn = (com.mysql.jdbc.Connection) dao.getDataSource().getConnection()) {
      
              conn.setAllowLoadLocalInfile(true);
      
              try(com.mysql.jdbc.Statement stmt = (com.mysql.jdbc.Statement) conn.createStatement()) {
      
                  stmt.execute("create temporary table BasicDbTest_1 (phone integer)");
      
                  String data = "8675309\n";
                  stmt.setLocalInfileInputStream(new ByteArrayInputStream(data.getBytes()));
      
                  stmt.execute("load data local infile '' into table BasicDbTest_1");
      
                  try(ResultSet rs = stmt.executeQuery("select phone from BasicDbTest_1")) {
                      Assert.assertTrue(rs.next());
                      Assert.assertEquals(rs.getInt(1), 8675309);                 
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-23
        • 2017-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多