0

我编写了一个 Java 程序来执行以下操作,并希望对我的设计提出意见:

  1. 从 CSV 文件中读取数据。该文件是一个包含 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!");
    }
}
4

2 回答 2

1

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

  1. 准备你的插入语句
  2. 开始交易
  3. 从中加载一行(或几行)
  4. 将小批量插入数据库
  5. 返回 3. 虽然还有一些行
  6. 犯罪

这样,您可以避免将整个转储加载到内存中。

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

于 2013-01-23T08:50:54.010 回答
0

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

于 2013-01-23T09:02:45.193 回答