问题描述
开发环境:
- Java 14.0.2(最新)
- sqlite 3.30.1
- 在MacOS上
- 使用Eclipse IDE
我使用内存数据库,并且数据库文件表中有成千上万个项目(约80万个项目)。
我只是使用for循环一个接一个地更新列。
但是太慢了。
我知道for循环效率很低。
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();