|
|
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
Добрий день Использую JPA EclipseLink для роботы з БД. Надо создать много (1000...) записей в таблице. Если я исполюзую entity-класы, прохожу по них в цыкле и для каждого вызываю: Код: java 1. То это делаеться слишком долго... Вот и подумал, если со всех записей создать большой SQL-запрос и отправить его, может и быстрее будет... Создал я такой метод: Код: java 1. 2. 3. 4. 5. Передаю эму такое: Код: xml 1. И не работает. Говорит : Код: java 1. В WorkBench, этот SQL без проблем исполняется а тут не в какую! Но если делать только один INSERT, то все нормально. Если больше - не работает. Думал что в JPA есть встроенное средство что б записать список одним махом, а не писать по одному обьекту, но тоже не нашел... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2013, 12:52 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
denis111111В WorkBench, этот SQL без проблем исполняется а тут не в какую! Сюрприз. А ещё в подобных инсрументах бывают даже свои команды. Как например, GO в SQL Server Manager, которого нет в SQL. Ваш WorkBench разбивает всё на отдельные запросы и выполняет каждый отдельный запрос. JDBC делегирует это разработчику, так как протокол работый с RDBMS, обычно, такого не умеет. Ключевое слово в решении вашей проблемы - Batch Update. Но. В JPA он уже реализован. Вам нужно только 1) Использовать один и тот же EntityManager для каждого persist() 2) Вызывать переодически flush, чтобы не забивать память. http://stackoverflow.com/questions/448181/batch-inserts-with-jpa-ejb3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2013, 13:06 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Спасибо, я понял в чем проблема... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2013, 13:24 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
denis111111Blazkowicz, Спасибо, я понял в чем проблема...Такая JPA-реализация как, например, EclipseLink сама может делать batch updates. См. ссылку . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2013, 14:05 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
Blazkowicz1) Использовать один и тот же EntityManager для каждого persist() 2) Вызывать переодически flush, чтобы не забивать память. http://stackoverflow.com/questions/448181/batch-inserts-with-jpa-ejb3 Слушайте, а у меня какой интересный эффект: если делать flush каждые 20 записей, например, то реально вставляться в базу будет только каждая 20-я. Если каждые 100 - каждая сотая. Причем, сохраняться будет каждая первая запись из пачки (batch), которая завершается очередным flush. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2014, 11:02 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
То есть, для меня получается сделать массовый Insert в базу в рамках одной транзакции, только если после КАЖДОЙ операции persist() вызывать flush(); clear(); Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2014, 11:13 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
Если вообще не делать Код: java 1. 2. в базу попадет только 1 последняя запись ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2014, 11:15 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
sheich, А как вы переменную "с" меняете? Может сам объект менятете, вместо того чтобы создать новый? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2014, 11:17 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
Blazkowiczsheich, А как вы переменную "с" меняете? Может сам объект менятете, вместо того чтобы создать новый? вообще, да. я объект один раз создаю, в цикле меняя его свойства ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2014, 11:43 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
То есть, вот так, если быть точным Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2014, 11:46 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
sheichвообще, да. я объект один раз создаю, в цикле меняя его свойства Вот и ответ. :D Не делайте так. Один объект - одна сущность - одна запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2014, 11:46 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
Blazkowiczsheichвообще, да. я объект один раз создаю, в цикле меняя его свойства Вот и ответ. :D Не делайте так. Один объект - одна сущность - одна запись. Хотелось избежать "лишнего" создания объекта, для экономии памяти Странно... а ведь если создавать объект все-таки один раз, и каждый раз делать flush, clear - работает! Какая связь? clear очищает старое состояние объекта? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2014, 11:54 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
sheichХотелось избежать "лишнего" создания объекта, для экономии памяти Google -> Premature Optimization Google -> Java Object Pooling Google -> Java GC Ergonomics sheichСтранно... а ведь если создавать объект все-таки один раз, и каждый раз делать flush, clear - работает! Какая связь? clear очищает старое состояние объекта? EntityManager aka Session aka Unit-of-Work это кэш. Он накапливает изменения, пока не произойдет flush. Когда меняется состояние объекта снаружи. Меняется его состояние и внутри EntityManager. При повторном вызове persist EM имеет ссылки всё ещё на один и тот же объект. Реализация кеша в EM тривиальная для увеличения производительности. И никаких снэпшотов с объектов не делает. Когда делает flush - кеш очищается, и создаётся новая запись. После этого изменения состояния на этот кеш не влияют, объекта в нем уже нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2014, 12:04 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, мне одному кажется странной подобная самоуверенность в своих знаниях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2014, 12:25 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
smackmychiмне одному кажется странной подобная самоуверенность в своих знаниях? Нет. В Java слишком много всего противоречащего здравому смыслу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2014, 12:37 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
Если под несколькими insert подразумевается пакетная загрузка - то лучше не использовать JPA. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2014, 13:25 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
maytonЕсли под несколькими insert подразумевается пакетная загрузка - то лучше не использовать JPA. Мне казалось, что JPA как раз существует для: - оптимизации запросов к БД - абстрагирования от уровня / диалекта конкретной БД Если я хочу залить в БД несколько тысяч записей, логично ли предположить, что через JPA это произойдет быстрее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2014, 14:35 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
sheichМне казалось, что JPA как раз существует для: - оптимизации запросов к БД - абстрагирования от уровня / диалекта конкретной БД Если я хочу залить в БД несколько тысяч записей, логично ли предположить, что через JPA это произойдет быстрее? Заблуждение 3 раза. JPA это ORM для JEE. Задачи ORM - Упростить CRUD - Упростить загрузку сложных структур - Минимизировать работу с SQL, увеличив работу с объектами. ORM не оптимизирует запросы. ORM не ставит своей целью отвязаться от конкретной RDBMS. ORM не даёт прироста в производительности. Он местами упрощает работу девелопера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2014, 14:39 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
sheichЕсли я хочу залить в БД несколько тысяч записей, логично ли предположить, что через JPA это произойдет быстрее? Нет! Если вы хотите залить в БД несколько тысячь записей, то как раз JPA абсолютно не подходит. Для этого у каждой БД есть свои "нативные" средства импорта данных, например, из CSV. JPA в лучшем случае "упращает" часть работы программиста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2014, 06:42 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
mad_nazgulЕсли вы хотите залить в БД несколько тысячь записей, то как раз JPA абсолютно не подходит. Для этого у каждой БД есть свои "нативные" средства импорта данных, например, из CSV. Единственная проблема в том что если это делать на живом сервере, то нужно побеспокоиться о том чтобы кеширование на уровне ORM не помешало увидеть новые записи (например, если они доступны только через ассоциации или кешируемый запрос) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2014, 09:17 |
|
||
|
INSERT нескольких записей в БД средствами JPA
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЕдинственная проблема в том что если это делать на живом сервере, то нужно побеспокоиться о том чтобы кеширование на уровне ORM не помешало увидеть новые записи (например, если они доступны только через ассоциации или кешируемый запрос) Проблемы ORM, СУБД не волнуют! <:o) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2014, 06:37 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38817966&tid=2126187]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
163ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
74ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 489ms |

| 0 / 0 |
