这个数据库转储设计好吗?

时间:2013-01-23 08:22:23

标签: mysql sql dump opencsv

我编写了一个Java程序来执行以下操作,并希望对我的设计有所了解:

  1. 从CSV文件中读取数据。该文件是一个包含6列的数据库转储。
  2. 将数据写入MySQL数据库表。
  3. 数据库表如下:

        CREATE TABLE MYTABLE
        (
       ID int PRIMARY KEY not null auto_increment,
       ARTICLEID int,
       ATTRIBUTE varchar(20),
       VALUE text,
       LANGUAGE smallint,
       TYPE smallint
        );
    
    1. 我创建了一个存储每一行​​的对象。
    2. 我使用OpenCSV将每行读入1中创建的对象列表。
    3. 迭代此对象列表并使用PreparedStatements,我将每一行写入数据库。
    4. 解决方案应该非常适合需求的变化,并展示出良好的方法,稳健性和代码质量。

      那个设计看起来不错吗?

      我尝试的另一种方法是使用'LOAD DATA LOCAL INFILE'sql语句。这会是一个更好的选择吗?

      编辑:我现在正在使用OpenCSV,它正在处理在实际字段中包含逗号的问题。现在的问题是写入数据库。谁能告诉我为什么?

      public static void exportDataToDb(List<Object> data) {
          Connection conn = connect("jdbc:mysql://localhost:3306/datadb","myuser","password");
      
          try{
              PreparedStatement preparedStatement = null;
              String query = "INSERT into mytable (ID, X, Y, Z) VALUES(?,?,?,?);";
              preparedStatement = conn.prepareStatement(query);
      
              for(Object o : data){   
                  preparedStatement.setString(1, o.getId());
                  preparedStatement.setString(2, o.getX());
                  preparedStatement.setString(3, o.getY());
                  preparedStatement.setString(4, o.getZ());
              }
              preparedStatement.executeBatch();
      
          }catch (SQLException s){
              System.out.println("SQL statement is not executed!");
          }
      }
      

2 个答案:

答案 0 :(得分:1)

从纯粹的算法角度来看,除非您的源CSV文件很小,否则最好

  1. 准备插入声明
  2. 开始交易
  3. 从中加载一行(或几行)
  4. 将小批量插入数据库
  5. 返回3.虽然有一些行仍然存在
  6. 提交
  7. 这样,您就可以避免将整个转储加载到内存中。

    但基本上,您最好使用LOAD DATA

答案 1 :(得分:0)

如果没有。行是巨大的,然后代码将在步骤2失败,内存不足错误。您需要找到一种方法来获取块中的行并使用为该块准备好的语句执行批处理,继续处理所有行。这适用于任何不。行和批处理将提高性能。除此之外,我没有看到任何设计问题。