2012-05-09 3 views
0

Я только что включил ведение журнала запросов в базе данных, работая с JPA (EclipseLink), и стал свидетелем ужаса JPA «оптимизация» и «кеширование».JPA-запрос «оптимизация»

Например, делая простой JPA запрос следующим образом:

SELECT p FROM Picklist p; 

... заставит JPA сделать миллион запросов SQL к базе данных (один запрос для каждой записи, поэтому выберите * из списка выбора где id = [...]). И Picklist - простая сущность!

Почему он не делает выбор SELECT * FROM Picklist и просто делает все остальное (заполняя Контраст Persistance или что-то еще) в памяти?

Нужен ли какой-то специальный переключатель, чтобы сказать ему об этом? Почему он работает так?

+1

почему не ВЫБРАТЬ р от Picklist р; ? без (Picklist p) –

+0

ошибка типографии, исправлена. – bozo

ответ

1

Прежде всего, необходимо проверить JPA Query

SELECT Picklist p FROM Picklist p; 

это должно быть

SELECT p FROM Picklist p; 

Во-вторых вы должны понимать, что вы не можете сделать Select *, потому что, когда вы делаете запрос этого типа вы «Принесите больше информации, что только столбцы.

Третье помните, что Hibernate необходимо перевести запрос в каждую базу данных, чтобы обеспечить такую ​​функциональность, какую производительность может потерять, поскольку это Sql Native, тем не менее, это улучшилось с каждой новой версией, и если вам нужна высокая производительность. Используйте обычный запрос Sql, который вы отлично можете использовать и обрабатывать записи.

0

JPA предоставляет множество методов оптимизации запросов, но если вы не используете их, вы можете вызвать ненужные запросы.

Я предполагаю, что вы видите запросы для связей в списке выбора, хотя точный запрос, который вы используете, отображает сопоставление для Picklist и SQL.

Чтобы увидеть, как оптимизировать отношения

см, http://java-persistence-performance.blogspot.com/2010/08/batch-fetching-optimizing-object-graph.html

+0

Так, например, у меня есть Клиент, у которого есть несколько полей, которые являются объектом Picklist, то есть для customerType и industryType. Теперь я вызываю 5 раз daoPicklist.getByName («партнер»), и я получаю список выбора и назначаю его существующей стороне клиента и объединяя его. Этот daoPicklist.getByName (...) вызывается много раз в (разных модулях) кода для извлечения списка выбора. Но то, что происходит, когда я смотрю журналы запросов базы данных, - это то, что каждый раз, когда я вызываю этот метод, выполняется SQL-запрос! Таким образом, никакого кэширования вообще нет. – bozo

+0

Что делает daoPicklist.getByName (...)? Если он выполняет запрос не по идентификатору, он всегда будет обращаться к базе данных, если вы не включите кеш запросов. – James

Смежные вопросы