微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Java上更新数据库的多列性能

如何解决在Java上更新数据库的多列性能

开发环境:

  • Java 14.0.2(最新)
  • sqlite 3.30.1
  • 在MacOS上
  • 使用Eclipse IDE

我使用内存数据库,并且数据库文件表中有成千上万个项目(约80万个项目)。
我只是使用for循环一个一个地更新列。
但是太慢了。
我知道for循环效率很低。

以下代码中的值和条件不是来自DB。
只是一些代码计算的值。

for (i = 0; i < Array.length; i++) {
    update(array1[i],array2[i],array3[i],array4[i],array5[i],array6[i],valueArray[i]);
}

public void update(int condition1,String condition2,int condition3,int condition4,String condition5,int condition6,int value) {
        try (PreparedStatement pst = connection.prepareStatement(query)) {
                String query = "UPDATE table\n"
                        + "SET value = ?\n"
                        + "WHERE condition1 = ?\n"
                        + "AND condition2 = ?\n"
                        + "AND condition3 = ?\n"
                        + "AND condition4 = ?\n"
                        + "AND condition5 = ?\n"
                        + "AND condition6 = ?\n";
                
                pst.setInt(1,value);
                pst.setString(2,condition1);
                pst.setInt(3,condition2);
                pst.setInt(4,condition3);
                pst.setString(5,condition4);
                pst.setInt(6,condition5);
                pst.setInt(7,condition6);
                
                pst.execute();
            }
        } catch (sqlException e) {
            e.printstacktrace();
        }
    }

如何调整代码

解决方法

循环本身不是问题,在单独更新每行时涉及往返。通过使用批处理更新可以提高性能:

        List<DeckOccurrences> res = (from d in App.EF.Db2.DeckSource
                                     join de in App.EF.Db2.Deck on d.DeckSourceId equals de.DeckGuid into j1
                                     from j2 in j1.DefaultIfEmpty()
                                     group j2 by d.DeckSourceId into grouped
                                     select new DeckOccurrences()
                                     {
                                         DeckGuid = grouped.Key,Count = grouped.Count(t => t.DeckGuid != null)
                                     }).ToList();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。