0

Google Guava の CacheLoader loadAll() メソッドをオーバーライドしようとしています。一括検索を実行して、CachesExplainedに記載されているように特に要求されていない Employee コレクション内のすべてのドキュメントを取得したいと考えています。

特に要求されていないキーの値をロードする CacheLoader.loadAll 実装を作成できることに注意してください。たとえば、あるグループの任意のキーの値を計算すると、グループ内のすべてのキーの値が得られる場合、loadAll はグループの残りの部分を同時にロードする可能性があります。

私はインターネットを精査しましたが、私の問題にリモートで関連していることがわかった唯一の投稿は、Google Guava の CacheLoader loadAll() method Implementation Issuesでした。ただし、コレクションからすべてのドキュメントを一括取得することはまだできません。コードを実行するたびに、データベースから取得される値は、List を介して具体的に渡された値だけです。

Mongo コレクション名 Employees があり、その中に 3 つの従業員ドキュメントがあるとします。

{"_id" : "123", "John Doe", "CEO"}
{"_id" : "456", "Jane Doe", "President"}
{"_id" : "789", "Jimmy Doe", "CFO"}

従業員クラス:

public class Employee extends MongoDbModel {

    @Id
    private final String employeeNumber;

    private final String name;

    private final String type;

    public Employee(String employeeNumber, String name, String type){
        this.employeeNumber = employeeNumber;
        this.name = name;
        this.type = type;

    }

    public String getEmployeeNumber() {
        return employeeNumber;
    }

    public String getName() {
        return name;
    }

    public String getType() {
        return type;
    }

    public static LoadingCache<String, Employee> employeeCacheMap;
    static {
        employeeCacheMap = CacheBuilder.newBuilder()
                .concurrencyLevel(4)
                .weakKeys()
                .maximumSize(10000)
                .expireAfterWrite(5, TimeUnit.MINUTES)
                .build(
                        new CacheLoader<String, Employee>() {
                            @Override
                            public Employee load(String key) throws ExecutionException{
                                return getOneFromDatabase(key);
                            }
                            @Override
                            public Map<String, Employee> loadAll(Iterable<? extends String> key){
                                return getAllEmployeesFromDatabase();
                            }
                        }
                );
    }

    private static Employee getOneFromDatabase(String employeeNumber){
        return MongoDbStore.createQuery(Employee.class).filter("_id", employeeNumber).first();
    }

    private static Map<String, Employee> getAllEmployeesFromDatabase(){
        final List<Employee> list = MongoDbStore.createQuery(Employee.class).asList();

        final Map<String, Employee> map = new HashMap<String,Employee>(list.size());
        for(final Employee employee : list){
            map.put(employee.getName(), employee);
        }
        return map;
    }

    public static LoadingCache<String, Employee> getLoadingCache(){
        return employeeCacheMap;
    }
}

このメソッドを実行するたびに:

public void getAllEmployees(){
    List<String> myList = new ArrayList<>();
    myList.add("123");
    myList.add("456");
    Map<String, Employee> employeeMap = null;
    try {
        employeeMap = Employee.getLoadingCache().getAll(myList);
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
    for(Employee employee : employeeMap.values()){
        System.out.println(employee.getName());
    }
}

印刷するだけです:

"John Doe"
"Jane Doe"

上記のCachesExplainedからの引用で説明されている 3 つの名前すべての代わりに。

上記の引用を誤解していますか? CacheLoader は、コレクションからすべての値を取得するのではなく、loadAll() メソッドに渡された値のみを取得しますか? どんな助けでも大歓迎です

4

0 に答える 0