powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / INSERT нескольких записей в БД средствами JPA
21 сообщений из 21, страница 1 из 1
INSERT нескольких записей в БД средствами JPA
    #38316997
denis111111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрий день

Использую JPA EclipseLink для роботы з БД.

Надо создать много (1000...) записей в таблице. Если я исполюзую entity-класы, прохожу по них в цыкле и для каждого вызываю:

Код: java
1.
getEntityManager().persist(entity);



То это делаеться слишком долго...

Вот и подумал, если со всех записей создать большой SQL-запрос и отправить его, может и быстрее будет...

Создал я такой метод:
Код: java
1.
2.
3.
4.
5.
public int insertNativeSQL(String sql) {
        Query q = getEntityManager().createNativeQuery(sql);
        int result = q.executeUpdate();
        return result;
    }



Передаю эму такое:

Код: xml
1.
String sql = "INSERT INTO dog (name)VALUES('jon'); INSERT INTO dog (name)VALUES('bob');


И не работает.
Говорит :
Код: java
1.
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax;


В WorkBench, этот SQL без проблем исполняется а тут не в какую!

Но если делать только один INSERT, то все нормально. Если больше - не работает.

Думал что в JPA есть встроенное средство что б записать список одним махом, а не писать по одному обьекту, но тоже не нашел...
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38317022
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38317052
denis111111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Спасибо, я понял в чем проблема...
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38317110
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
denis111111Blazkowicz,

Спасибо, я понял в чем проблема...Такая JPA-реализация как, например, EclipseLink сама может делать batch updates. См. ссылку .
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
INSERT нескольких записей в БД средствами JPA
    #38815869
sheich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz1) Использовать один и тот же EntityManager для каждого persist()
2) Вызывать переодически flush, чтобы не забивать память.
http://stackoverflow.com/questions/448181/batch-inserts-with-jpa-ejb3
Слушайте, а у меня какой интересный эффект: если делать flush каждые 20 записей, например, то реально вставляться в базу будет только каждая 20-я. Если каждые 100 - каждая сотая. Причем, сохраняться будет каждая первая запись из пачки (batch), которая завершается очередным flush.
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38815876
sheich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть, для меня получается сделать массовый Insert в базу в рамках одной транзакции, только если после КАЖДОЙ операции persist() вызывать flush(); clear();
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("open4jPU");
        EntityManager em = emf.createEntityManager();

            em.getTransaction().begin();

for ( int i=0; i<100000; i++ ) {

em.persist(c);
                 em.flush();
                 em.clear();

        }

em.getTransaction().commit();
em.close();
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38815877
sheich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если вообще не делать
Код: java
1.
2.
                 em.flush();
                 em.clear();


в базу попадет только 1 последняя запись
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38815879
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sheich,

А как вы переменную "с" меняете? Может сам объект менятете, вместо того чтобы создать новый?
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38815900
sheich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczsheich,

А как вы переменную "с" меняете? Может сам объект менятете, вместо того чтобы создать новый?
вообще, да. я объект один раз создаю, в цикле меняя его свойства
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38815905
sheich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть, вот так, если быть точным
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("open4jPU");
        EntityManager em = emf.createEntityManager();

        Customer c = new Customer();

        em.getTransaction().begin();

        for (int i = 0; i < 100000; i++) {

            em.persist(c);
            em.flush();
            em.clear();

        }

        em.getTransaction().commit();
        em.close();
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38815906
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sheichвообще, да. я объект один раз создаю, в цикле меняя его свойства
Вот и ответ.
:D Не делайте так. Один объект - одна сущность - одна запись.
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38815911
sheich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczsheichвообще, да. я объект один раз создаю, в цикле меняя его свойства
Вот и ответ.
:D Не делайте так. Один объект - одна сущность - одна запись.
Хотелось избежать "лишнего" создания объекта, для экономии памяти
Странно... а ведь если создавать объект все-таки один раз, и каждый раз делать flush, clear - работает!
Какая связь?
clear очищает старое состояние объекта?
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38815918
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 - кеш очищается, и создаётся новая запись. После этого изменения состояния на этот кеш не влияют, объекта в нем уже нет.
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38815946
smackmychi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

мне одному кажется странной подобная самоуверенность в своих знаниях?
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38815962
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smackmychiмне одному кажется странной подобная самоуверенность в своих знаниях?
Нет. В Java слишком много всего противоречащего здравому смыслу.
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38816034
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если под несколькими insert подразумевается пакетная загрузка - то лучше не использовать JPA.
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38816151
sheich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonЕсли под несколькими insert подразумевается пакетная загрузка - то лучше не использовать JPA.
Мне казалось, что JPA как раз существует для:
- оптимизации запросов к БД
- абстрагирования от уровня / диалекта конкретной БД

Если я хочу залить в БД несколько тысяч записей, логично ли предположить, что через JPA это произойдет быстрее?
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38816160
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sheichМне казалось, что JPA как раз существует для:
- оптимизации запросов к БД
- абстрагирования от уровня / диалекта конкретной БД
Если я хочу залить в БД несколько тысяч записей, логично ли предположить, что через JPA это произойдет быстрее?
Заблуждение 3 раза.
JPA это ORM для JEE.

Задачи ORM
- Упростить CRUD
- Упростить загрузку сложных структур
- Минимизировать работу с SQL, увеличив работу с объектами.

ORM не оптимизирует запросы.
ORM не ставит своей целью отвязаться от конкретной RDBMS.
ORM не даёт прироста в производительности. Он местами упрощает работу девелопера.
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38816879
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sheichЕсли я хочу залить в БД несколько тысяч записей, логично ли предположить, что через JPA это произойдет быстрее?

Нет!
Если вы хотите залить в БД несколько тысячь записей, то как раз JPA абсолютно не подходит.
Для этого у каждой БД есть свои "нативные" средства импорта данных, например, из CSV.
JPA в лучшем случае "упращает" часть работы программиста.
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38816941
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgulЕсли вы хотите залить в БД несколько тысячь записей, то как раз JPA абсолютно не подходит.
Для этого у каждой БД есть свои "нативные" средства импорта данных, например, из CSV.

Единственная проблема в том что если это делать на живом сервере, то нужно побеспокоиться о том чтобы кеширование на уровне ORM не помешало увидеть новые записи (например, если они доступны только через ассоциации или кешируемый запрос)
...
Рейтинг: 0 / 0
INSERT нескольких записей в БД средствами JPA
    #38817966
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЕдинственная проблема в том что если это делать на живом сервере, то нужно побеспокоиться о том чтобы кеширование на уровне ORM не помешало увидеть новые записи (например, если они доступны только через ассоциации или кешируемый запрос)

Проблемы ORM, СУБД не волнуют!
<:o)
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / INSERT нескольких записей в БД средствами JPA
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]