대량 작업을 구현해야 할 때 ORM 프레임 워크를 포기해야합니까?


15

일반적인 상황은 다음과 같습니다.

  • ORM 프레임 워크를 사용하는 응용 프로그램에서 대량 작업을 구현해야합니다.
  • 첫 번째 통과 후 중요한 성능 문제를 발견했습니다.

내 질문은 다음과 같습니다.

  • 이 상황에서 원시 SQL을 포함하는 솔루션을 선호 해야 합니까?
  • 또는 ORM 프레임 워크의 대량 작업과 일반적으로 관련된 문제를 완화하는 데 도움이되는 잘 알려진 디자인 패턴이 있습니까?

편집하다:

  • 전체 응용 프로그램에서 ORM 프레임 워크를 제거 해야하는지 묻지 않습니다.
  • 나는 묻고있다 : 당신은이 작은 응용 프로그램 조각에 대한 ORM 프레임 워크를 포기해야합니까?

당신은 나도 몰라 한다 아무것도 할,하지만 당신은 시도 일괄 처리 대량 작업을?
ChrisAnnODell

답변:


13

ORM은 데이터베이스에 대한 액세스 권한을 완전히 인수하기위한 것이 아닙니다. CRUD 인 코드의 80 %에 직접 사용하면 너무 지루한 코드를 사용하십시오. 저장 프로 시저, 동적 SQL 또는 신중하게 최적화해야하는 나머지 20 %에 대해 원하는 것을 사용하십시오.


4
데이터베이스 추상화가 ORM을 사용하기로 결정한 주된 이유 중 하나가 아닌 경우에는 작동합니다.

@ Pierre303, 귀하의 의견을 이해하는 데 어려움을 겪고 있습니다. 무슨 소리 야?
Mark Canlas

@MarkCanlas : 원하는 경우 데이터베이스를 변경 (예 : SQL Server에서 MySQL로 전환) 할 수 있다는 의미에서 "데이터베이스를 추출하는 것"을 의미한다고 생각합니다. 실제로이 사용 사례는 거의 발생하지 않습니다.
Robert Harvey

1
여전히 추상화를 만들 수 있습니다. 실제로 여러 공급자 / 방언을 지원하는 대부분의 ORM은 공급자 / 방언 별 코드를 지원합니다. 특정 데이터베이스에 대해 대량 삽입 / 배열 바인딩 / TVP / 무엇으로 작업을 구현하고 SQLite와 같은 지원되지 않는 공급자에 대해서는 느리게 진행되도록 할 수 있습니다. 최악의 경우 빌드 또는 구성 매개 변수를 기반으로 다른 구현에서 별도의 인터페이스 / 클래스 및 서브로 확장 기능을 분리 할 수 ​​있습니다.
Aaronaught

예, 맞춤 방언과 특정 문제에 대한 특정 코드가 도움이 될 수 있습니다. 그러나 이것이 재무 적 관점에서 실행 가능하려면 엄격한 최소값으로 제한되어야합니다. 우리의 커스터마이징 사용자 정의 함수 (방언)는 전체 데이터 액세스 코드베이스의 0.1 % 미만을 나타냅니다. 그것이 그 이상이라면 정말 걱정할 것입니다.

7

고성능이 필요하고 수십억 개의 레코드를 처리하는 응용 프로그램에서 ORM (nHibernate)을 사용합니다. 시간이 지남에 따라 가장 중요한 성능 문제는 ORM 단독이 아닌 ORM 사용 방식과 관련이 있음을 알았습니다.

ORM은 필수 데이터베이스 지식을 대체하지 않아야합니다. 코드의 생산성과 유연성을 높이기 위해 사용하는 도구이지만 성능을 최적화하려면 기본 프로세스를 알아야합니다.

특정 ORM을 지정하지 않았으므로 다음은 성능을 개선하기 위해 수행 한 작업입니다.

  • 우리는 ORM 프로파일 러를 사용했습니다. (nhprof를 사용했습니다)
  • 데이터베이스 프로파일 러를 사용했습니다. (우리는 SQL Server 프로파일 러를 사용했습니다)
  • 우리는 주제에 관해 가능한 많은 기사를 읽습니다. (문서의 주제에 대한 전체 장 외에도 nHibernate를 위해 많은 것들이 사용 가능했습니다)
  • 성능 및 확장성에 대한 특정 책을 구입했습니다.
  • 자체 최적화를 테스트하기 위해 벤치마킹 시스템을 만들었습니다.
  • 더 중요한 것은 실제 데이터를 사용하여 실제 데이터를 사용하여 코드를 테스트 할 수 있다는 것입니다. 마지막으로 응용 프로그램에서 대부분의 문제를 발견 할 수있었습니다.

1

우리는 Entity Framework를 사용하여 관리했지만 응용 프로그램은 많은 배치 스타일 작업 (개별 테이블에 많은 수의 레코드를 작성 함)을 수행 했으므로 적합합니다. 앱에서 특수 목적 코드의 양을 줄이기 위해 가능한 경우 ORM 프레임 워크를 유지할 수 있는지 확실히 알 것입니다. 쓰기를 버퍼링 한 다음 그룹으로 실행할 수 있습니까? 트랜잭션 의미를 잃어 버리지 만 대량 작업을 진행하는 경우 이미 그 용어를 사용했다고 가정합니다.


1

ORM은 마법 같은 일을하지 않습니다. 이들은 객체 액세스 방법을 SQL로 변환합니다. 실행하는 SQL 문이 수동으로 작성하는 SQL보다 느릴 필요는 없습니다. 말했듯이, 당신이 우연히 만날 수있는 몇 가지 문제가 있습니다.

  1. 트랜잭션 : 하나의 대규모 대량 작업은 동일한 작업을 함께 수행하는 많은 소규모 트랜잭션보다 거의 항상 빠릅니다. 따라서 ORM 메소드 호출이 세분화 된 트랜잭션을 사용하는 경우 (예 : Spring Roo 엔티티의 활성 레코드 스타일 메소드는 기본적으로 @Transactional로 주석 처리됨) 대량 조작이 느려집니다. 응용 프로그램에 해당되는 경우 트랜잭션 논리를 확인해야합니다.
  2. 캐싱 : 최대 절전 모드에서 첫 번째 수준 캐시를 사용하면 엔터티 관리자가 데이터베이스에 대한 불필요한 왕복을 피할 수 있습니다. 일반적으로 좋지만 대량 삽입에는 좋지 않습니다. 불필요하게 캐시가 막히면 응용 프로그램 성능이 저하됩니다. 그것이 당신의 문제라면, ChrisAnnODell이 위에서 제안한 배치 패턴을 봐야합니다. 우리는 수입 업체에서 사용하며 대량 인서트 속도를 크게 향상시킵니다.

기본 SQL을 사용하여 성능을 향상시키는 데 아무런 문제가 없습니다. 그러나 먼저 속도를 늦추는 것이 무엇인지 이해해야합니다.


캐시를 피하려면 StatelessSession을 사용하십시오. 또한 자동 증분 ID를 피하십시오. 대신 HiLo 또는 Guid를 사용해야합니다.

1

ORM을 우회하십시오. 뿐만 아니라 "일반"SQL도 무시하십시오. 데이터베이스의 대량 유틸리티를 사용하여 스테이징 테이블에 매우 큰 데이터 세트를 삽입하십시오. 그런 다음 sql을 사용하여 스테이징 활동을 수행하십시오.

"블로그 맛"ORM이 모든 상황에서 작동하지 않을 수 있습니다.


맞습니다. 이러한 종류의 백엔드 도구는 배우기가 번거롭지 만 약 3-4 회 정도 지나면 전문가가되어 다른 방법으로는 할 수없는 일을 더 빨리 수행 할 수 있습니다. 삽과 불도저의 차이점과 같습니다. 텍스트 입력 파일을 읽고 저수준 작업으로 데이터를 업데이트하기 위해 다양한 플랫폼을위한 스크립트 제어 도구를 작성했습니다. 그러한 도구를 작성하면 인생을 더 쉽게 (또는 적어도 더 재미있게) 만들 수 있습니다. 이와 같은 것은 소프트웨어 업데이트 중에 클라이언트 설치에 대한 사용자 정의 데이터를 조정하는 데 사용될 수 있습니다.

0

그런 상황에 처했습니다. 때때로, 당신은해야합니다.

일부 ORM을 통해 개발자는 객체 모델을 건너 뛰고 데이터베이스 계층으로 바로 이동할 수 있습니다.

또한 대량 작업을 캡슐화하여 객체 지향으로 사용하는 ORM도 있습니다.


0

umlcat 에서 언급했듯이 대량 작업을 사용할 수있는 일부 ORM이 있습니다.

또한 많은 ORM을 확장 할 수 있으므로 벌크 작업을 실행하기위한 고유 한 방법을 작성할 수 있습니다 (아직 지원되지 않는 경우). 응용 프로그램의 대량 작업이 고려할 수있는 요소 인 경우 ORM에 계층으로 추가합니다 (그렇게하려면 원시 SQL을 작성해야 할 것입니다).하지만 응용 프로그램에서 ORM을 사용하십시오 구현 한 방법.

또한 단위 테스트 및 디버깅이 쉬워집니다. ORM 분석법에 대한 테스트 범위가 충분하면 앱에서 무료로 사용할 수 있습니다. 그렇지 않으면 원시 SQL (특히 트랜잭션 및 많은 JOIN이있는 큰 SQL)을 디버깅하는 것이 어려울 수 있습니다.

거의 100 LOC 인 원시 SQL 호출에서 버그를 발견하는 데 거의 하루가 걸렸습니다. 버그는 단지 하나의 문자였습니다! 그 이후로 앱에서 원시 SQL을 사용하지 않고 모든 SQL 프로 시저를 개별적으로 단위 테스트했습니다.


0

내가 알고있는 디자인 패턴이 없습니다. 제 생각 엔 당신이 ORM을 결정한 이유는 ORM을 포기하는 것이 당신이 원하는 것이 아닐 것입니다. 그러나이 경우 두 솔루션을 혼합 할 여지가 있다고 생각합니다. 소프트웨어에서 ORM의 기본 사용에서 벗어난 이유를 고의적으로 기록하고 문서화하는 한, 아무 문제가 없습니다. 또한 일부 ORM 프레임 워크에는 대량 작업을 수행 할 수있는 기능이 있습니다. nHibernate (.NET 프레임 워크의 ORM)에는 StatelessSessions라고 불리는데 오버 헤드가 훨씬 적지 만 여전히 원하는 성능을 향상시키지 못할 수 있습니다. 이 경우에는 원시 SQL 만 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.