2012-01-03 2 views
11

(잠재적으로 매우 큰) XML 파일 내부의 레코드와 일치하도록 Doctrine 엔티티를 업데이트해야합니다. 또한 XML의 데이터에 따라 ManyToMany 연결을 업데이트해야합니다.doctrine2 - 플러시 효율을 향상시키는 방법은 무엇입니까?

  1. (현재의 엔티티 연결을 얻을 XML 데이터를 얻을
  2. DB에서 얻을 엔티티 (존재하지 않는 것은 새로운 만드는 경우)
  3. 설정 새로운 개체 속성 : 이것은 내가 루프 안에 할 것입니다 게터는) 하위 루프에서
  4. ArrayCollection::add()를 호출하여 ArrayCollection::clear())
  5. 설정 새로운 연결을 (호출하여 (ArrayCollection 객체)
  6. 분명 모든 연결을 반환
  7. 는 내가 EntityManager::flush() 전화 루프 후

EntityManager의로 엔티티를 지속.

플러싱은 여러 행을 한 번에 업데이트/삽입/삭제하는 대신 많은 양의 쿼리를 생성합니다.

  • SELECT (이 실제로 어떤 속성이 변경하지 않기 때문에 지금은 생략 ... 아직)
  • 이전 취소 삭제 개체 속성을 업데이트 할 UPDATE
  • DB
  • 에서 개체를 얻을 : 모든 개체에 대해 다음 쿼리를 실행 협회
  • 새로운 협회 XML에서 305 개 레코드에 대한 총 그래서

내가 (나는 모든 엔티티가 변경 할 경우 1220 개 쿼리까지 갈 수 생각)하는이 일을하게 915 개 쿼리를 얻기를 삽입하는 INSERT 전자 가져 오기가 매우 느립니다.

루프 이전에 IdentityMap과 엔티티를 미리 가져올 수 있지만 여전히 UPDATE/DELETE/INSERT 쿼리가 있습니다.

  • 여러 가지 DELETE 쿼리 대신 다중 삽입, WHERE IN 등을 사용하여 플러시 메서드가 쿼리를 더 잘 최적화하도록하는 방법이 있습니까?
  • 플러시 메서드의 정상적인 동작입니까? 아니면 잘못된 것이 있습니까?
  • 아마도 엔티티의 연관성을 업데이트하는 방식에 문제가있을 수 있습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? ("get/clear/add"메쏘드 대신에)
  • 나는 Doctrine이 대량 베치 처리를위한 것이 아니라는 것을 알고 있지만, XML 가져 오기를 위해 그것을 사용하는 것이 DB 불일치를 피하는 가장 좋은 방법이라고 생각한다. ORM이 아닌 방식. 그게 맞습니까?
  • 위의 방법이 잘못 되었다면 어떻게 문제를 해결해야합니까?

답변

관련 문제