Проблема производительности при импорте «большого» объема данных из веб-сервиса в MSSQL 2005 - PullRequest
0 голосов
/ 18 октября 2011

У меня есть программа, которая используется для репликации / зеркалирования основных таблиц (около 20) из Oracle в MSSQL 2005 через веб-сервис (REST).

Программа периодически читает данные XML из веб-сервиса и преобразует их в список через сущность jpa. Этот список сущностей будет сохранен в MSSQL через JPA. Вся сущность jpa будет предоставлена ​​командой, создавшей веб-сервис.

Есть две проблемы, которые я замечаю и после некоторых поисков кажется неразрешимой.

1-й выпуск: Производительность вставки / обновления через JDBC jpa очень низкая, она занимает около 0,1 с на строку ... Выполнение того же с помощью C # -> datatable -> bulkinsert для новой таблицы в DB -> вызов хранимой процедуры для выполнения массовой вставки / обновления базы объединений занимает 0,01 с для 4000 записей. (Каждая таблица будет содержать около 500-5000 записей каждые 5 минут)

Ниже показан снимок кода Java, который выполняет задачу-> постоянная библиотека -> EclipseLink JPA2.0

private void GetEntityA(OurClient client, EntityManager em, DBWriter dbWriter){        
//code to log time and others
  List<EntityA> response = client.findEntityA_XML();
  em.setFlushMode(FlushModeType.COMMIT);
  em.getTransaction().begin();
  int count = 0;
  for (EntityA object : response) {
    count++;
    em.merge(object);
    //Batch commit
    if (count % 1000 == 0){
      try{
        em.getTransaction().commit();
        em.getTransaction().begin();
        commitRecords = count;
      } catch (Exception e) {
        em.getTransaction().rollback();
      }
    }
  }
  try{
    em.getTransaction().commit();
  } catch (Exception e) {
    em.getTransaction().rollback();
  }
  //dbWriter write log to DB
}

Что-то сделано неправильно, вызывая медлительность? Как я могу улучшить скорость вставки / обновления?

2-й выпуск: Существует около 20 таблиц для репликации, и я создал такое же количество методов, как и выше, в основном скопировав вышеописанный метод 20 раз, заменив EntityA на EntityB и так далее, и вы получите идея ...

Есть ли способ обобщить метод так, чтобы я мог добавить любую сущность?

Ответы [ 2 ]

0 голосов
/ 18 октября 2011

Вы можете выполнить SQL, хранимую процедуру или JPQL обновить все запросы также через JPA.Я не уверен, откуда берутся эти объекты, но если вы просто переносите одну таблицу в другую в той же базе данных, вы можете сделать то же самое, что вы делали в C # в Java с JPA.

Есливы хотите обработать объекты в JPA, затем посмотрите, http://java -persistence-performance.blogspot.com / 2011/06 / как улучшить jpa-performance-by-1825.html

Для # 2 измените EntityA на Object, и у вас есть универсальный метод.

0 голосов
/ 18 октября 2011

Производительность вставки / обновления через jpa JDBC очень низкая,

ИЛИ, как правило, медленны для массовых вставок.По определению.Вы муравьиная скорость?Используйте другой подход.

Как правило, ORM не будет обслуживать подход массовой вставки / хранимой процедуры, и здесь его забивают.Вы используете неправильный метод appraoch для высокопроизводительных вставок.

Существует около 20 таблиц для репликации, и я создал такое же количество методов, как и в предыдущем примере, в основном скопировав вышеуказанный метод 20 раз и заменив EntityA на EntityBи так далее, вы поняли ...

Generics.Часть Java в течение некоторого времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...