Я борюсь с проблемой производительности для функции копирования, которую мое приложение предоставляет пользователям. Я не уверен, что пойду правильно. У меня нет большого опыта в Hibernate.
Чрезмерно упрощенный макет будет:
Project ---> (One to Many) Items ---> (One to Many) Tasks
Project ---> (One to Many) Variables
Items <---> Variables (Many to Many)
Таким образом, у проекта может быть много элементов, и у каждого элемента может быть много задач. Проект может иметь переменные (без дубликатов), и между элементами и переменными может быть много-много (они связаны друг с другом).
Может быть несколько сотен элементов на проект, с несколькими (20-30) задачами на элемент и несколькими сотнями переменных на проект. Я добавил функцию, которая позволяет пользователям проверять, какие элементы и задачи они хотят скопировать из одного проекта в другой. Там не может быть никаких дубликатов.
Вот процесс, который я выполняю для каждого проверяемого элемента:
- Проверьте, существует ли элемент в целевом проекте, если он есть, добавьте его, в противном случае - нет. Я использовал session.createFilter для запроса целевого проекта (по имени элемента). Если предмет не существует, я добавляю его. (
object.save()
) и добавьте его в коллекцию предметов целевого проекта.
- Если к элементу прикреплены переменные, я проверяю целевой проект на наличие этих переменных (снова
session.createFilter()
), добавляю их, если их нет, затем добавляю их в коллекцию item.variables
Я не уверен, что, если что-нибудь, я могу сделать, чтобы ускорить это. Я предполагаю, что выполнение всех проверок сначала не помогает. Я не знаю, является ли createFilter лучшим способом проверки наличия элементов / переменных в целевом проекте.
Я пытался изменить способ добавления объектов в коллекции. Я бы добавил их по одному (targetProject.add(item)
), теперь я сохраняю их в массиве и, когда все элементы перебираются, я делаю targetProject.addAll(items)
. Я не мог сказать разницу, хотя.
Есть ли лучший способ сделать это? Я использую Ehcache в качестве кэширования второго уровня. Я также все еще на Hibernate 3.2.5.
Любая помощь приветствуется.