Как получить доступ к коллекции java, как к таблице в базе данных, с индексами и LINQ-подобными запросами - PullRequest
1 голос
/ 06 мая 2010

Эта задача время от времени возникает в моих проектах. Мне нужно обработать коллекцию некоторых сложных элементов, имеющих различные атрибуты, такие как login, password_hash, role и т. Д. И мне нужно иметь возможность запрашивать эту коллекцию, так же как я запрашиваю таблицу в базе данных, имея только частичные данные. Например: получить всех пользователей с ролью «пользователь». Или проверьте, есть ли пользователь с логином «root» и ролью «superuser». Удаление элементов, основанных на тех же данных, также необходимо. Первая попытка - использовать коллекции Google, коллекции Apache и lambdaj. Все они имеют очень похожий механизм предикатов, но с большим недостатком: он основан на итерации, один за другим, над коллекцией элементов, что не очень хорошо, для часто используемых коллекций, содержащих большие объемы данных. Не могли бы вы предложить мне какое-нибудь решение? Спасибо.

UPDATE:

В настоящее время я решил эту проблему, реализовав свою собственную коллекцию с несколькими индексами, чтобы я мог выполнять прямые запросы: http://code.google.com/p/tablej/

Ответы [ 3 ]

1 голос
/ 06 мая 2010

Java не может делать LINQ. Он даже близко не подходит из-за отсутствия лямбд, yield, методов расширения и деревьев выражений. Проект quaere предлагает замену бедняку.

Однако я не думаю, что это удовлетворит ваши требования к эффективности алгоритмов. Это может быть сделано только одним из двух способов, AFAIK:

  1. Структуры данных с ручным кодированием, оптимизированные для вопросов, которые вы хотите задать.
  2. В памяти HSQLDB .

Первый вариант сложен, но, вероятно, даст лучшую производительность. Последний не будет таким быстрым, но все будет в порядке, особенно если он правильно настроен с индексами, и с ним намного проще работать.

1 голос
/ 06 мая 2010

База данных не является автоматически эффективной; вам действительно нужно настроить базу данных (поместив индексы в соответствующие столбцы), чтобы она могла эффективно выполнять поиск.

Аналогичным образом вы можете оптимизировать свой код для скорости. Если вам нужно сделать много поисков по нескольким критериям, вы можете сделать для этого специальные коллекции. Похоже на индекс по базе данных.

Вы сделаете это, не только вставив своего пользователя в список пользователей, но и поместив того же пользователя, например, в карту, привязанную к роли:

public void addUser(User user) {
    users.add(user);
    // your index
    if (!usersByRole.containsKey(user.getRole()) {
       usersByRole.put(user.getRole(), new ArrayList<User>());
    }
    usersByRole.get(user.getRole()).add(user);
}

public List<User> findByRole(String role) {
    if (!usersByRole.containsKey(role)) {
        return Collectsions.emptyList();
    }
    return Collections.unmodifieableList(usersByRole.get(role));
}
1 голос
/ 06 мая 2010

Вы можете встроить базу данных в свое приложение.
Здесь - это обсуждение выбора лучшей встроенной базы данных Java.

Те, что ниже, вероятно, входят в тройку лидеров (все они бесплатные).

  • HSQLDB имеет хорошую репутацию.
  • Java DB Java DB включена в Java SE Development Kit и является разработчикомбаза данных для сервера Sun GlassFish Enterprise.Он также имеет хорошую репутацию.
  • Berkeley DB Является зрелым продуктом, также высокой репутацией.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...