2009-02-09 5 views
5

오른쪽 - 데이터베이스에서 1,000,000 개의 레코드를 삭제하고 싶습니다. 트랜잭션이 시간 초과되어 실패하는 시간이 오래 걸립니다. - 일괄 처리로 삭제하면 트랜잭션 당 25000 개의 레코드가 발생합니다. Oracle에서 MySQL 또는 ROWNUM의 제한 절을 사용합니다. 위대한 작품입니다.Java ORM을 통한 일괄 삭제/삭제

데이터베이스 독립적 인 방식으로이 작업을 수행하려고합니다. 그리고 JPA/Hibernate를 사용하는 기존 Java 코드베이스에서.

행운입니다. JPA Query.setMaxResults 및 setFirstResult에는 쓰기 '검색어'(예 : 삭제)에 대해 효과가 없습니다. 개별적으로 삭제하기 위해 많은 엔티티를 메모리로 선택하면 매우 느리고 벙어리입니다.

그래서 원시 쿼리를 사용하고 응용 프로그램 코드에서 '제한'절을 관리합니다. orm.xml에이 절을 캡슐화하면 좋겠지 만 ... "Hibernate Annotations 3.2는 기본 쿼리를 사용하는 대량 업데이트/삭제를 지원하지 않습니다." - http://opensource.atlassian.com/projects/hibernate/browse/ANN-469.

저는 이것이 일반적인 문제라고 생각합니다. 아무도 더 나은 데이터베이스 독립적 솔루션을 얻었습니까?

답변

0

쿼리 제한은 데이터베이스 관련 기능이며 SQL 표준이 없습니다 (동의해야 함).

대부분의 데이터베이스에서 작동하는 솔루션은보기를 사용하여 여러 테이블을 하나의 테이블로 그룹화합니다. 각 테이블에는 데이터의 하위 집합 (예 : 하루)이 포함되어 있습니다. 이렇게하면 한 번에 전체 하위 집합을 삭제할 수 있습니다. 즉, 많은 데이터베이스는 이러한 뷰에서 UPDATE 및 INSERT를 실행하는 데 문제가 있습니다.

일반적으로 INSERT/UPDATE (단일 테이블, "현재"테이블을 가리킴) 및 검색을위한 그룹화 뷰에 대한 뷰 또는 별칭을 만들어이 문제를 해결할 수 있습니다.

일부 데이터베이스는 기본적으로 행을 가져야하는 기본 테이블 (INSERT)을 지정하는 열을 정의 할 수 있다는 점을 제외하면 기본적으로 동일한 파티션을 제공합니다. 하위 집합을 삭제해야 할 경우 기본 테이블 중 하나를 삭제하거나자를 수 있습니다.

5

나는 건설적인 대답은 아니지만 ORM은 실제로 데이터베이스에서 대량 작업을 수행하는 것이 아닙니다. 따라서 네이티브 쿼리가 아마도 이러한 작업을위한 최선의 방법 일 것입니다.

또한 ORM이 데이터베이스의 새로운 상태를 반영하도록 업데이트해야합니다. 그렇지 않으면 이상한 일이 발생할 수 있습니다.

ORM은 개체를 데이터베이스에 매핑하기위한 훌륭한 도구이지만 일반적으로 일반 데이터베이스 인터페이스는 아닙니다.

0

는 당신이 영속 컨텍스트와 캐시를 우회 HQL (JPA QL) 직접 DML 작업을 사용하고, 직접 (결과 SQL) 문을 실행할 수 있다고 생각 :

Query q = session.createQuery("delete YourEntity ye where ye.something like :param"); 
q.setParameter("param", "anything"); 
int deletedEntities = q.executeUpdate(); 
+0

질문자가 이미이 작업을 수행하고 있지만 삭제가 너무 느려서 시간이 초과된다는 것을 알았습니다. –

0

q.setMaxResults(int)

을 .. .sony

+0

OP는 이미 성공을 거두지 않고 이것을 시도한 것으로 나타났습니다. JPA 쿼리.setMaxResults와 setFirstResult는 write 'queries'...에 영향을주지 않습니다. – Mac

관련 문제