Как ускорить доступ к списку в JPA

1

В моем классе mapper мне всегда нужно получить список отделов из моей компании:

  @OneToMany(mappedBy = "company", orphanRemoval = true, cascade = CascadeType.ALL)
  public List<CompanyDepartments> getDepartments()
  {
    return departments; //java.util.List variable. 
  }

Есть несколько тысяч отделов (около 2000+). Я пытаюсь сократить время, затрачиваемое на получение данных компании, и хочу начать с отделов, которые будут довольно статичными по своей природе.

Вариант 1: я всегда могу иметь частный метод в Mapper, который заполняет кеш при первом загрузке и возвращает из кэша все время.

Но есть ли что-нибудь более упрощенное? Я, вероятно, не первый, кто столкнулся с этим, и хотел узнать, как я мог бы подойти к этому. Есть ли известная аннотация, которую можно использовать. Как аннотация @Singleton по переменной в сущности? (нет такой аннотации, очевидно). Каков самый простой способ сделать этот список синглом.

Просто типичное приложение весеннего mvc 3, использующее весовые данные jpa для взаимодействия db.

Теги:
spring
jpa

2 ответа

1

То, что вы испытываете, является частью "несоответствия реляционного импеданса object-". Одним из решений было бы расширить вашу объектную модель, чтобы вы могли использовать левую попытку соединения для загрузки нескольких компаний, включая их подразделения, используя только один оператор SQL.

Проблема с использованием этого метода заключается в том, что вы можете заполнять только один список за раз. Хотя легко и легко определить множество подписок в мире объектов, трудно загрузить все эти списки одновременно (и, следовательно, эффективно) из реляционной базы данных. Однако это можно сделать в Oracle с использованием запросов object- или XMLType.

Прямой способ получить такие данные из СУБД - это написать пользовательские запросы, которые точно соответствуют задаче и предоставить только те данные, которые действительно необходимы. Для этого вам понадобится не только один класс компании, но и много - по одному для каждой задачи. - на самом деле вы наследуете вместо атрибуции

BTW, поэтому ORM по-прежнему считается Вьетнамом информатики - легко начать, но с трудом добиться успеха.

1

Я предлагаю эту ссылку, которая решает проблему запроса n +1... Как я могу решить проблему N +1 Selects?

Кроме того, вы можете поместить кеш (lvl 2) в службу поиска, если данные не изменяются в течение жизненного цикла приложения. http://docs.spring.io/spring/docs/3.1.0.M1/spring-framework-reference/html/cache.html

Другим подходом является добавление индексов на db.

Надеюсь, я дал вам все ответы на ваш вопрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню