Предпосылка: Я предлагаю вам использовать инструмент объектно-реляционного отображения, такой как Hibernate , в вашем проекте java, чтобы отобразить объектно-ориентированную модель предметной области в реляционную базы данных, и пусть инструмент неявно обрабатывает механизм кэширования. Hibernate специально реализует многоуровневую схему кэширования (для получения дополнительной информации перейдите по следующей ссылке: https://www.tutorialspoint.com/hibernate/hibernate_caching.htm)
Независимо от моего предположения о предпосылке вы также можете вручную создайте одноэлементный класс, который будет использоваться из каждого класса в проекте, который будет взаимодействовать с БД:
public class MongoDBConnector {
private static final Logger LOGGER = LoggerFactory.getLogger(MongoDBConnector.class);
private static MongoDBConnector instance;
//Cache period in seconds
public static int DB_ELEMENTS_CACHE_PERIOD = 30;
//Latest cache update time
private DateTime latestUpdateTime;
//The cache data layer from DB
private Map<KType,VType> elements;
private MongoDBConnector() {
}
public static synchronized MongoDBConnector getInstance() {
if (instance == null) {
instance = new MongoDBConnector();
}
return instance;
}
}
Здесь вы можете определить метод загрузки , который используется для обновления сопоставление со значениями, хранящимися в БД, а также метод записи , который вместо этого идет для записи значений в БД со следующими характеристиками:
1 - эти методы должны быть синхронизированы во избежание проблем при выполнении нескольких вызовов.
2- метод загрузки должен применять период кэширования logi c (возможно с настраиваемым периодом) Чтобы избежать загрузки для каждого метода, вызовите данные из БД.
Пример: Предположим, ваш период кеширования составляет 30 с. Это означает, что если в течение 30 с выполняется 10 операций чтения из разных точек кода, вы будете загружать данные из БД только при первом вызове, в то время как другие будут читать из кэшированной карты, улучшая производительность.
Примечание: Чем больше период кеширования, тем выше производительность вашего кода , но , если БД управляется, вы создадите несогласованность с кешем, если вставка выполняется извне (из другого инструмента или вручную). Поэтому выберите наилучшее значение для вас.
public synchronized Map<KType, VType> getElements() throws ConnectorException {
final DateTime currentTime = new DateTime();
if (latestUpdateTime == null || (Seconds.secondsBetween(latestUpdateTime, currentTime).getSeconds() > DB_ELEMENTS_CACHE_PERIOD)) {
LOGGER.debug("Cache is expired. Reading values from DB");
//Read from DB and update cache
//....
sampleTime = currentTime;
}
return elements;
}
3 - метод хранения должен автоматически обновлять кэш, если вставка выполняется правильно, независимо от того, истек ли период кеша:
public synchronized void storeElement(final VType object) throws ConnectorException {
//Insert object on DB ( throws a ConnectorException if insert fails )
//...
//Update cache regardless the cache period
loadElementsIgnoreCachePeriod();
}
Затем вы можете получить элементы из каждой точки вашего кода следующим образом:
Map<KType,VType> liveElements = MongoDBConnector.getElements();