У нас есть система, которая выполняет «грубый поиск», вызывая интерфейс в другой системе, которая возвращает набор объектов Java. Как только мы получили результаты поиска, мне нужно иметь возможность дополнительно фильтровать результирующие объекты Java на основе определенных критериев, описывающих состояние атрибутов (например, из исходных объектов возвращаются все объекты, где xy> z && ab == c).
Критерии, используемые для фильтрации набора объектов каждый раз, частично настраиваются пользователем, под этим я подразумеваю, что пользователи смогут выбирать значения и диапазоны для сопоставления, но атрибуты, из которых они могут выбирать, будут фиксированным набором.
Наборы данных могут содержать <= 10000 объектов для каждого поиска. Поиск будет выполняться вручную базой пользователей приложения, вероятно, не более 2000 раз в день (приблизительно). Вероятно, стоит упомянуть, что все объекты в наборе результатов являются известными классами объектов домена, которые имеют аннотации Hibernate и JPA, описывающие их структуру и отношения. </p>
Возможные решения
С макушки головы я могу придумать 3 способа сделать это:
- Для каждого поиска сохраните исходные объекты набора результатов в нашей базе данных, а затем используйте Hibernate, чтобы повторно запросить их, используя более точные критерии.
- Используйте базу данных в памяти (например, hsqldb?) Для запроса и уточнения начального набора результатов.
- Напишите некоторый пользовательский код, который повторяет исходный набор результатов и извлекает нужные записи.
Вариант 1
Вариант 1, по-видимому, включает в себя множество операций по сети с физической базой данных (Oracle 10g), что может привести к большой сетевой и дисковой активности. Также потребуется, чтобы результаты каждого поиска были изолированы от других наборов результатов, чтобы гарантировать, что различные поиски не мешают друг другу.
Вариант 2
Вариант 2 кажется хорошей идеей в принципе, поскольку он позволил бы мне выполнить более точный запрос в памяти и не требовал бы сохранения данных результата, которые были бы отброшены только после завершения поиска. Суть в том, что это также может быть довольно производительным, но может привести к увеличению объема используемой памяти (это хорошо, поскольку мы можем быть достаточно гибкими в отношении объема памяти, которую получает наша JVM).
Вариант 3
Вариант 3 может быть очень производительным, но я бы хотел этого избежать, поскольку любой код, который мы пишем, потребовал бы такого тщательного тестирования, чтобы время, затрачиваемое на создание чего-то гибкого и достаточно надежного, могло бы быть непомерно высоким.
У меня нет времени на создание прототипа всех 3 идей, поэтому я ищу комментарии, которые могут быть у людей по поводу 3 вариантов выше, плюс любые другие идеи, которые я не рассмотрел, чтобы помочь мне решить, какая идея может быть наиболее подходящей. В настоящее время я склоняюсь к варианту 2 (в базе данных памяти), поэтому хотел бы узнать мнение людей, имеющих опыт запроса POJO в памяти.
Надеюсь, я описал ситуацию достаточно подробно, но не стесняйтесь спрашивать, требуется ли какая-либо дополнительная информация для лучшего понимания сценария.
Приветствия
Edd