2008-11-04 3 views
18

메모리 내 HSQL 데이터베이스에 5 초마다 8000 개 이상의 객체를 일정한 비율로 삽입/업데이트 할 수 있어야합니다.ORM 솔루션 (JPA, Hibernate) vs. JDBC

Spring/Hibernate/JPA와 pure JDBC 사이의 비교 성능 테스트를 수행했습니다. 나는 HSQL을 사용하여 성능에 상당한 차이가 있음을 발견했다. Spring/Hib/JPA를 사용하면 5 초 만에 1.5KB 개체 (1 - Many 및 Many - Many 관계)의 3000-4000을 삽입 할 수 있으며 직접 JDBC 호출 동일한 객체를 10,000-12,000 개 삽입 할 수 있습니다.

왜 이렇게 큰 불일치가 있는지 알 수 없습니다. 나는 Spring/Hib/JPA 설정을 행운이없이 성능을 향상시키기 위해 많은 노력을 기울였다. Spring/Hib/JPA를 장래의 목적, 확장 성, 그리고 외래 키 관계 (one-many와 many-many)로 손으로 유지하기가 어렵 기 때문에 사용하고 싶습니다. 성능 요구 사항은 순수한 JDBC 사용을 가리키는 것 같습니다.

거대한 불일치가있는 이유는 무엇입니까?

+2

제목이 실제 질문을 잘 설명하지 못하기 때문에이 질문의 이름을 바꿀 수도 있습니다. –

+0

당신은 무엇을 제안하겠습니까? – systemoutprintln

답변

15

Hibernate와 JDBC를 일괄 처리 모드 (Statement # executeBatch())에서 비교 한 경험이 비슷합니다. 기본적으로 Hibernate는 대량 작업으로는 그렇게하지 않을 것 같습니다. 우리의 경우, Hibernate 구현은 우리의 생산 하드웨어에서 충분히 빠르다.

DAO에서 데이터베이스 호출을 래핑하여 응용 프로그램에 일관된 데이터 액세스 방법을 제공하는 것이 좋습니다. DAO를 Hibernate와 함께 구현하고, 성능 요구 사항이 필요한 곳에서 JDBC를 구현하십시오.

+1

Hib 일괄 처리를 했습니까? 내 테스트에서 Hib 일괄 처리와 JDBC 일괄 처리는 거의 동일했습니다. –

5

Hibernate는 더티 검사 (dirty checking)에서 사용할 객체의 1 차 레벨 캐시를 유지하고 작업 단위 (Unit of Work) 및 아이덴티티 맵 (Identity Map)으로 작동합니다. 이로 인해 오버 헤드가 추가되고, 특히 벌크 유형 작업이 증가합니다. 대량 작업의 경우이 상태를 유지하지 않는 StatelessSessions을 조사하는 것이 좋습니다.

+1

문서가 이동했을 수 있습니다. http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html – JavaRocky

2

모든 매핑 ... 조금 비싸고 모든 비범 한 논리와 모든 반사 및 일관성 검사가 있어야합니다.

매핑의 포인트는 성능을 향상시키는 것이 아닙니다. 일반적으로 실적이 좋습니다. 하지만 성과 (개발자 수, )에서 잃는 것은 개발자 생산성, 일관성, 테스트 가능성, 안정성 및 훨씬 더 탐낼 특성에서 여러 번 이상을 얻습니다. 일반적으로 추가 성능이 필요하고 매핑을 포기하고 싶지 않은 경우 하드웨어를 더 추가해야합니다.

9

최소한 Hibernate에서 배치 삽입을 수행해야합니다. http://www.hibernate.org/hib_docs/reference/en/html/batch.html 많은 왕복 시간을 절약합니다.

그리고 Hath의 주요 목표는 컴퓨터 성능이 아니라 개발자의 성능입니다. 그렇다고해서 JDBC 결과에 필적할만한 것은 아니지만 그다지 나쁘지는 않습니다.

+0

문서가 이동 한 것 같습니다. 여기를보십시오 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html – JavaRocky

+0

또한 이것은 문서에서 언급되었지만 놓치기 쉽습니다. 삽입을 수행하고 자동 생성 기본 키가있는 엔티티를 사용하여 작업하는 경우 일괄 처리 모드가 무시됩니다. – Pace

5

모든 문제에 대해 하나의 기술을 사용하지 마십시오. 문제에 따라 사용할 기술을 결정하십시오. 물론 jpa 또는 hibernate는 jdbc보다 느립니다. jdbc가 jpa보다 낮은 레벨에 있습니다. 또한 jdbc를 사용하는 db 전문가는 jpa보다 더 최적화 된 SQL을 작성할 수 있습니다. 속도가 필요한 임계점을 제시하면 jpa는 선택 사항이 아닙니다.