Вы должны реализовать кэширование самостоятельно, если это актуально для вашего случая использования и у вас есть что-то кэшировать: вероятно, что-то не связанные со сделкой, так что никаких узлов или связей; Ионы Neo4j сложны, поскольку их можно использовать повторно, поэтому, вероятно, лучше всего их кэшировать на короткое время или вообще не использовать. Идентификаторы уровня приложения были бы точными, как и бины, состоящие из строк или скалярных типов.
Предположим, у вас есть эта процедура определено:
public class MyProcedure {
@Context
public GraphDatabaseService db;
@Procedure
public Stream<MyBean> doSomething(@Name("uuid") String uuid) {
int count = 0;
// ...
return Stream.of(new MyBean(count));
}
public static class MyBean {
public int count;
public MyBean(int count) {
this.count = count;
}
}
}
Вы можете добавить некоторые простые кэширования с помощью ConcurrentMap
:
public class MyProcedure {
private static final ConcurrentMap<String, Collection<MyBean>> CACHE =
new ConcurrentHashMap<>();
@Context
public GraphDatabaseService db;
@Procedure
public Stream<MyBean> doSomething(@Name("uuid") String uuid) {
Collection<MyBean> result = CACHE.computeIfAbsent(uuid,
k -> doSomethingCacheable(k).collect(Collectors.toList()));
return result.stream();
}
private Stream<MyBean> doSomethingCacheable(String uuid) {
int count = 0;
// ...
return Stream.of(new MyBean(count));
}
public static class MyBean {
// ...
}
}
Обратите внимание, что вы не можете кэшировать Stream
, как это можно употреблять только один раз, так что вам придется потреблять его самостоятельно, собирая в ArrayList
(вы также можете переместить collect
внутри метода, изменить тип возврата на Collection<MyBean>
и использовать ссылку на метод). Если процедура принимает более одного аргумента, вам нужно создать правильный класс для составного ключа (неизменяемый, если это возможно, с правильной реализацией equals
и hashCode
). К ключам применяются также ограничения, применимые к кешируемым значениям.
Это вечный неограниченный кеш. Если вам нужно больше возможностей (срок действия, максимальный размер), я предлагаю использовать реальную реализацию кеша, например GuavaCache
(или LoadingCache
) или Ben Manes 'Caffeine.
Спасибо, я надеялся, что есть что-то из коробки, поэтому я также могу сравнить реализации кэширования, но попробую один из предложенных вами библиотек вместо того, что я сделал сам. –