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

标签 mysql sql dump opencsv

我编写了一个 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

关于mysql - 这个数据库转储设计好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14475193/

相关文章:

php - Yii 模型 : convert table name to lower case

sql - django-admin.py 转储数据到 SQL 语句

MySQL 其中 x 中的 2 个

mysql - (Ruby) 如何转储数据库?

mysql - phpMyAdmin 找不到创建事件的语法

PHP MySql - 如何确定进程的优先级

php - Codeigniter 和 AJAX MySQL 错误处理

sql - 如何在同一个查询中从不同的表中检索相似的行?

java - 混淆 mySql 转储文件中的关键字段以保护隐私

c - 打印控制台页面后,如何暂停我的 C 程序?