Hibernate - Копирование объектов при проверке, существуют ли они в первую очередь - медленная производительность - лучший подход - PullRequest
0 голосов
/ 02 февраля 2012

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

Чрезмерно упрощенный макет будет:

Project ---> (One to Many) Items ---> (One to Many) Tasks
Project ---> (One to Many) Variables
Items <---> Variables (Many to Many)

Таким образом, у проекта может быть много элементов, и у каждого элемента может быть много задач. Проект может иметь переменные (без дубликатов), и между элементами и переменными может быть много-много (они связаны друг с другом).

Может быть несколько сотен элементов на проект, с несколькими (20-30) задачами на элемент и несколькими сотнями переменных на проект. Я добавил функцию, которая позволяет пользователям проверять, какие элементы и задачи они хотят скопировать из одного проекта в другой. Там не может быть никаких дубликатов.

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

  1. Проверьте, существует ли элемент в целевом проекте, если он есть, добавьте его, в противном случае - нет. Я использовал session.createFilter для запроса целевого проекта (по имени элемента). Если предмет не существует, я добавляю его. (object.save()) и добавьте его в коллекцию предметов целевого проекта.
  2. Если к элементу прикреплены переменные, я проверяю целевой проект на наличие этих переменных (снова session.createFilter()), добавляю их, если их нет, затем добавляю их в коллекцию item.variables

Я не уверен, что, если что-нибудь, я могу сделать, чтобы ускорить это. Я предполагаю, что выполнение всех проверок сначала не помогает. Я не знаю, является ли createFilter лучшим способом проверки наличия элементов / переменных в целевом проекте.

Я пытался изменить способ добавления объектов в коллекции. Я бы добавил их по одному (targetProject.add(item)), теперь я сохраняю их в массиве и, когда все элементы перебираются, я делаю targetProject.addAll(items). Я не мог сказать разницу, хотя.

Есть ли лучший способ сделать это? Я использую Ehcache в качестве кэширования второго уровня. Я также все еще на Hibernate 3.2.5.

Любая помощь приветствуется.

1 Ответ

1 голос
/ 02 февраля 2012

Похоже, ваш код выдает слишком много запросов к базе данных из-за частого использования createFilter().

Было бы лучше извлечь все необходимые объекты в память несколькими запросами, а затем выполнить необходимые проверки с использованием соответствующих структур данных в памяти (Map s, Set s).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...