В зависимости от того, насколько далеко вы хотите продвинуться, вы просите создать базу данных в памяти. Я предполагаю, что вы на самом деле не хотите этого делать или, по-видимому, используете одну из многих уже существующих баз данных Java в памяти ( Derby , H2 и т. Д.).
Если вам нужен индексированный или диапазонный доступ к нескольким атрибутам ваших данных, вам необходимо создать все эти индексы в структурах данных Clojure. Карты Clojure дадут вам O (log32 n) время доступа к данным (хуже, чем постоянные, но все еще очень ограниченные). Если вам нужно лучше, вы можете использовать Java-карты, такие как HashMap или ConcurrentHashMap напрямую с предупреждением о том, что вы находитесь вне модели данных Clojure. Для доступа к диапазону вам понадобится какая-то сортированная древовидная структура данных ... В Java есть ConcurentSkipListMap , что очень хорошо для ее работы. Если этого недостаточно, вам может понадобиться ваш собственный btree impl.
Если вы не меняете эти данные, то STM Clojure не имеет значения. Эти данные обрабатываются как кеш подмножества базы данных? Если это так, вы можете рассмотреть возможность использования библиотеки кеша, например Ehcache (недавно они добавили поддержку очень больших кэшей вне кучи и возможностей поиска).
Балансирование данных между кэш-памятью в памяти и постоянным хранилищем - сложная задача, и одна из самых важных вещей, которую нужно сделать правильно в приложениях, насыщенных данными.