【问题标题】:How to batch insert when insert depends on data ready to be batched插入时如何批量插入取决于准备批处理的数据
【发布时间】:2016-04-15 15:52:06
【问题描述】:

我的 Java 应用程序从 CSV 文件中读取行并将它们放入数据库 (Apache Derby)。我想实现批量插入,因为我要插入数千条记录,所以我想要性能改进。但是,如何插入数据取决于数据库中已经存在的数据,例如我想批处理以下插入:

INSERT INTO user (name) VALUES (?);

但是,如果下面没有返回任何数据,我只会执行上面的操作:

SELECT * FROM user WHERE name='Tim';

如果我正在批处理插入,那么我的 SELECT 可能找不到最新数据,因为它正在等待批处理。

谁能找到解决方案?也许是缓存机制?

【问题讨论】:

    标签: java sql database architecture derby


    【解决方案1】:

    一个简单的选项是让您的批处理条目插入/选择语句,这样插入只会在查询条件满足时发生。

    这将是这样的:

    Lists<String> usernames = new ArrayList<>();
    //.... data in list assumed
    for(String username: usernames) {
        statement.addBatch("INSERT INTO USER(NAME) SELECT '" + username+ "' FROM USER WHERE NOT EXISTS(SELECT 1 FROM USER WHERE NAME = '" + username + "')");
    }
    

    这将使数据库处理检查插入的记录是否存在。 数据库中已经有对应的每条语句都不会插入,它的返回计数将为 0。但无论如何你都不会关心它。

    我快速搜索了一下,发现 Derby 显然支持 INSERT/SELECT 功能。您可以在此处找到有关此语法的更多信息:https://db.apache.org/derby/docs/10.0/manuals/reference/sqlj40.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 2017-08-19
      相关资源
      最近更新 更多