我的Java应用程序从CSV文件中读取行并将它们放入数据库(Apache Derby)。我想实现批量插入,因为我插入了数千条记录,所以我希望提高性能。但是,如何插入数据取决于数据库中已有的数据,例如我想批量插入以下内容:
INSERT INTO user (name) VALUES (?);
但是,如果下面没有返回任何数据,我只执行上述操作:
SELECT * FROM user WHERE name='Tim';
如果我正在批处理插入,那么我的SELECT可能找不到最新的数据,因为它正在等待批处理。
任何人都可以找到解决方案吗?也许是缓存机制?
答案 0 :(得分:1)
一个简单的选项是使批处理条目成为INSERT / SELECT语句,这样只有在满足查询条件时才会发生插入。
这将是:
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.但无论如何你都不会关心它。
我快速用Google搜索,发现Derby显然支持INSERT / SELECT功能。您可以在此处找到有关此语法的更多信息:https://db.apache.org/derby/docs/10.0/manuals/reference/sqlj40.html