在代码优化过程中,我发现我在for循环中使用findOne()的几个方面 -
public List<User> validateUsers(List<String> userIds) {
List<User> validUsers = new ArrayList<>();
for ( String userId : userIds) {
User user = userRepository.findOne(userId); //Network hit :: expensive call
//Perform validations
...
//Add valid users to validUsers list
...
}
return validUsers;
}
如果我传递大量用户进行验证,则上面的方法需要很长时间。 [对于300名用户约5秒。]
然后我更改了上面的方法以使用findAll()并对结果集合执行验证 -
public List<User> validateUsers(List<String> userIds) {
List<User> validUsers = new ArrayList<>();
Iterable<User> itr = userRepository.findAll(userIds); //Only one Network hit
for ( User user : itr) {
//Perform validations
...
//Add valid users to validUsers list
...
}
return validUsers;
}
现在有300名用户,结果将在100毫秒内完成。 问题是:考虑到Cassandra的底层结构,使用findAll()是否有任何副作用?我也在使用CrudRepository。我应该使用CassandraRepository吗?
答案 0 :(得分:0)
以下是您尝试此操作时要考虑的参数。
由于使用主键字段的Cassandra查询速度更快,因此findOne可能会在大量数据的情况下表现更好。
但是,你可以尝试
stylesheets/terms_of_use.scss
来自List<T> findAllById(Iterable<ID> ids);