繁体   English   中英

这种数据库转储设计可以吗?

[英]Is this database dump design ok?

我已经编写了一个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!");
    }
}

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

  1. 准备您的插入语句
  2. 开始交易
  3. 从其中加载一(或几)行
  4. 将小批量插入数据库
  5. 返回3。
  6. 承诺

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM