2013-01-23 45 views
0

我写了一个Java程序做我的设计下,想意见:从CSV文件这个数据库转储设计好吗?

  1. 读取数据。该文件是具有6列的数据库转储。
  2. 将数据写入MySQL数据库表。

数据库表如下:

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将每行写入数据库。

该解决方案应该非常适合需求的变化,并展现出良好的方法,鲁棒性和代码质量。

那个设计看起来好吗?

我试过的另一种方法是使用'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

再次重新磨轮。 MySQL可以直接导入CSV数据:http://stackoverflow.com/questions/3025648/import-csv-to-mysql我不明白为什么要设置一行Java代码来将CSV导入到数据库中... – feeela

+0

@feeela此任务适用于工作申请。你认为你的建议阻止了我展示自己的编码技能,还是显示我知道外部工具? – TheCoder

+0

什么是您的源文件的(近似)预期大小? – RandomSeed

回答

1

从纯算法的角度来看,除非你的源CSV文件很小,这将是更好的

  1. 准备插入语句
  2. 启动事务
  3. 加载一个(或几行)
  4. 将小批量插入到您的数据库中
  5. 返回3.虽然有一些li网元remainig
  6. 提交

这样,就避免了在内存中加载整个转储。

但基本上,你可能最好使用LOAD DATA

+0

我正在下载LOAD DATA路线。我现在的问题是,该应用程序在表中插入额外的行;行不在CSV文件中。任何想法为什么发生这种情况?我怀疑这是与ID字段的自动增量有关。 – TheCoder

+0

@ user999353如果不需要的行是空的,则可能在行尾有问题(要使用LINES TERMINATED BY子句定义)。请注意,EOL是依赖于系统的。 – RandomSeed

+0

你是对的。我的行结束符是一个逗号,其中一列是一个逗号的句子。任何建议如何绕过这个? – TheCoder

0

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

+0

您是否同意LOAD DATA是尽可能最好的方法? – TheCoder