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

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
@Stateless
public class CatalogueFacadeBean implements ICatalogueService {

    @Override
    public Map<String, Object> uploadCatalogue(Map<String, Object> params) {
...
                    iNsiSprkpvb011.deleteAll();
                    List<NsiSprkpvb011> entityRows = formatListEntiryRows(csvrecords, result, NsiSprkpvb011.class);
                    iNsiSprkpvb011.bulkSave(entityRows);
                    break;
...
        return result;
    }
}

    @Override
    public void deleteAll() {
        String deleteQuery = "DELETE FROM ${tableName} t";
        String tableName = type.getSimpleName();

        Entity entityAnnotation = type.getAnnotation(Entity.class);
        if (entityAnnotation.name() != null && !entityAnnotation.name().isEmpty())
            tableName = entityAnnotation.name();

        Map<String, String> values = new HashMap<String, String>();
        values.put("tableName", tableName);
        StrSubstitutor sub = new StrSubstitutor(values);
        Query query = em.createQuery(sub.replace(deleteQuery));
        query.executeUpdate();
    }

public <T extends MyClass> Collection<T> bulkSave(Collection<T> entities) {
  final List<T> savedEntities = new ArrayList<T>(entities.size());
  int i = 0;
  for (T t : entities) {
    savedEntities.add(persistOrMerge(t));
    i++;
    if (i % batchSize == 0) {
      // Flush a batch of inserts and release memory.
      entityManager.flush();
      entityManager.clear();
    }
  }
  return savedEntities;
}

private <T extends MyClass> T persistOrMerge(T t) {
  if (t.getId() == null) {
    entityManager.persist(t);
    return t;
  } else {
    return entityManager.merge(t);
  }
}




Все загружается отлично, но через раз
То загрузили, все ок, гружу повторно, таблица чистая, гружу опять, все загружено

Почему это возникает?
Предположение, что при очищении таблицы не было коммита и и далее при вставке работает с удаленными объектами?
...
Рейтинг: 0 / 0
Загрузка в базу
    #39308641
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=Koba=-,

Что в этом коде "гружу" и какая именно таблица чистая? В БД или UI?
...
Рейтинг: 0 / 0
Загрузка в базу
    #39308654
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz-=Koba=-,

Что в этом коде "гружу" и какая именно таблица чистая? В БД или UI?

Код: java
1.
2.
3.
                    iNsiSprkpvb011.deleteAll();
                    List<NsiSprkpvb011> entityRows = formatListEntiryRows(csvrecords, result, NsiSprkpvb011.class);
                    iNsiSprkpvb011.bulkSave(entityRows);




1 Очищаем всю таблицу в БД
2 Получаем список entity
3 Вставляем их
...
Рейтинг: 0 / 0
Загрузка в базу
    #39308697
ali_tash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А где сам код сохранения в БД ?
...
Рейтинг: 0 / 0
Загрузка в базу
    #39308705
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так очищаю всю таблицу

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    @Override
    public void deleteAll() {
        String deleteQuery = "DELETE FROM ${tableName} t";
        String tableName = type.getSimpleName();

        Entity entityAnnotation = type.getAnnotation(Entity.class);
        if (entityAnnotation.name() != null && !entityAnnotation.name().isEmpty())
            tableName = entityAnnotation.name();

        Map<String, String> values = new HashMap<String, String>();
        values.put("tableName", tableName);
        StrSubstitutor sub = new StrSubstitutor(values);
        Query query = em.createQuery(sub.replace(deleteQuery));
        query.executeUpdate();
    }
...
Рейтинг: 0 / 0
Загрузка в базу
    #39308707
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так вставляю List entity

http://frightanic.com/software-development/jpa-batch-inserts/

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
@PersistenceContext
private EntityManager entityManager;
 
@Value("${hibernate.jdbc.batch_size}")
private int batchSize;
 
public <T extends MyClass> Collection<T> bulkSave(Collection<T> entities) {
  final List<T> savedEntities = new ArrayList<T>(entities.size());
  int i = 0;
  for (T t : entities) {
    savedEntities.add(persistOrMerge(t));
    i++;
    if (i % batchSize == 0) {
      // Flush a batch of inserts and release memory.
      entityManager.flush();
      entityManager.clear();
    }
  }
  return savedEntities;
}
 
private <T extends MyClass> T persistOrMerge(T t) {
  if (t.getId() == null) {
    entityManager.persist(t);
    return t;
  } else {
    return entityManager.merge(t);
  }
}
...
Рейтинг: 0 / 0
Загрузка в базу
    #39308708
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В итоге у меня вставляются через раз
1) Данные вставились в БД
2) Данных нет
3) Данные вставились в БД
4) итд
...
Рейтинг: 0 / 0
Загрузка в базу
    #39308729
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в какой момент проверяешь, что записалось в БД или нет? flush() делаешь?
...
Рейтинг: 0 / 0
Загрузка в базу
    #39308798
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паша01А в какой момент проверяешь, что записалось в БД или нет? flush() делаешь?

Код: java
1.
2.
3.
4.
5.
    if (i % batchSize == 0) {
      // Flush a batch of inserts and release memory.
      entityManager.flush();
      entityManager.clear();
    }



Вот fluash идет
...
Рейтинг: 0 / 0
Загрузка в базу
    #39308828
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1 При удалении всех записей из таблицы и вставке новых, всегда выполняется
Код: java
1.
return em.merge(t); метода bulkSave()



2 Если закомментировать удаление, то записи не дублируются в таблице идет сравнение id


Мое предположение
Я удаляю записи, вставляю новые, но так как id совпадают, то они мержаться с entity? которые помечены на удаление
Далее при коммите происходит удаление. Правильно ли мое предположение?

Удаление записей
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    @Override
    public void deleteAll() {
        String deleteQuery = "DELETE FROM ${tableName} t";
        String tableName = type.getSimpleName();

        Entity entityAnnotation = type.getAnnotation(Entity.class);
        if (entityAnnotation.name() != null && !entityAnnotation.name().isEmpty())
            tableName = entityAnnotation.name();

        Map<String, String> values = new HashMap<String, String>();
        values.put("tableName", tableName);
        StrSubstitutor sub = new StrSubstitutor(values);
        Query query = em.createQuery(sub.replace(deleteQuery));
        query.executeUpdate();
    }



Вставка записей
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
    @Override
    public <T> Collection<T> bulkSave(Collection<T> entities) {
        String fieldID = getFieldID();
        Method methodID = getMethodID();
        if (fieldID != null || methodID != null) {
            final List<T> savedEntities = new ArrayList<T>(entities.size());
            int i = 0;
            for (T t : entities) {
                if (!fieldID.isEmpty())
                    savedEntities.add(persistOrMergeField(t, fieldID));
                else if (methodID != null)
                    savedEntities.add(persistOrMergeMethod(t, methodID));
                i++;
                if (i % batchSize == 0) {
                    em.flush();
                    em.clear();
                }
            }
            return savedEntities;
        } else
            return Collections.EMPTY_LIST;
    }

    private <T> T persistOrMergeField(T t, String fieldID) {
        try {
            Expression expr = new Expression(t, "get" + fieldID, new Object[] {});
            expr.execute();
            if (expr.getValue() == null) {
                em.persist(t);
                return t;
            } else
                return em.merge(t);
        } catch (Exception e) {
            LoggerUtil.error(e.getMessage());
            return null;
        }
    }

    private <T> T persistOrMergeMethod(T t, Method methodID) {
        try {
            if (methodID.invoke(t) == null) {
                em.persist(t);
                return t;
            } else
                return em.merge(t);
        } catch (IllegalAccessException e) {
            LoggerUtil.error(e.getMessage());
            return null;
        } catch (InvocationTargetException e) {
            LoggerUtil.error(e.getMessage());
            return null;
        }
    }
...
Рейтинг: 0 / 0
Загрузка в базу
    #39309358
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=Koba=-Все загружается отлично, но через раз
То загрузили, все ок, гружу повторно, таблица чистая, гружу опять, все загружено

Почему это возникает?
Предположение, что при очищении таблицы не было коммита и и далее при вставке работает с удаленными объектами?
Странный четный-нечетный порядок вставок говорит о том что
ты скорее всего не учитываешь какое-то кеширование и уровни изоляции.

Вообще если быть честным то топик не про базу.
...
Рейтинг: 0 / 0
Загрузка в базу
    #39309466
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Часто причина подобных глюков в методе performExecutions . SQL выполняется не синхронно с операторами jpql, а в конце сессии.
Вроде даже видео на русском по этому поводу было.
В данном случае не помешает сразу после удаления вызвать flush
...
Рейтинг: 0 / 0
Загрузка в базу
    #39309706
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraЧасто причина подобных глюков в методе performExecutions . SQL выполняется не синхронно с операторами jpql, а в конце сессии.
Вроде даже видео на русском по этому поводу было.
В данном случае не помешает сразу после удаления вызвать flush

Да наверное в этом дело и было
Когда разбил удаление и вставку на отдельные транзакций стало все работать нормально
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Загрузка в базу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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