2

우리는 데이터 액세스를 위해 Spring-JPA를 사용하는 Spring 부트 프로젝트를 가지고있다. 우리는 행을 한 번 (또는 몇 번, 모두 몇 분 안에) 생성/업데이트하는 두 개의 테이블을 가지고 있습니다. 하루가 지난 행은 업데이트하지 않습니다. 이러한 테이블 (감사 테이블과 같은)은 매우 커질 수 있으며 Postgres의 테이블 분할 기능을 사용하여 한 달에 한 번씩 데이터를 분할 할 수 있습니다. 따라서 메인 테이블은 항상이 달의 데이터를 가지고 있습니다. 그러나 쿼리가 지난 달로부터의 검색을 필요로한다면 그것은 다른 파티션들로부터 그것을 읽습니다.Spring-JPA는 Postgres 파티션으로 작업 할 수 있습니까?

두 질문 :

1) 쿼리 수있는이 오래된 데이터를 보관하기위한 좋은 생각하지만 여전히 그것을두고? 2) Spring-JPA는 분할 된 테이블과 함께 작동합니까? 또는 쿼리를 분리하고 기본 쿼리를 수행하고 restult 집합을 연결하는 방법을 알아야합니까?

감사합니다.

답변

1

저는 일정 기간 동안 최대 절전 모드 & Spring JPA로 postgres 파티션으로 작업하고 있습니다. 그래서 저는 제 질문에 답할 수 있다고 생각합니다.

1) 이전 데이터를 보관해도 괜찮습니까?

자주 인덱스를 다시 인덱싱하지 않고 인덱스를 적용하는 경우 데이터를 분할하면 쿼리 결과가 빨라질 수 있습니다.

또한 포스트 그레스에서 클러스터 된 색인 기능을 사용하여 데이터를 더 빨리 가져올 수 있습니다.

이전 데이터가있는 테이블은 업데이트되지 않으므로 클러스터 된 인덱스는 성능을 효율적으로 향상시킵니다.

2) Spring-JPA는 분할 된 테이블과 함께 작동합니까? 또는 쿼리를 분리하고 기본 쿼리를 수행하고 restult 집합을 연결하는 방법을 알아야합니까?

스프링 JPA는 분할 된 테이블과 함께 즉시 사용할 수 있습니다. 이 테이블은 마스터 테이블과 하위 테이블에서 데이터를 검색하고 연결된 결과 집합을 반환합니다.

참고 : 분할 된 테이블에 문제가

당신이 분할 된 테이블에 직면하게 될 것이다 유일한 문제는 분할 된 테이블에 삽입합니다.

테이블을 파티션 할 때 마스터 테이블을 통한 트리거를 만들고 해당 트리거는 null을 반환합니다. 이것은 Spring JPA/Hibernate를 사용하는 분할 된 테이블에서 삽입 문제의 핵심이다.

당신이 스프링 JPA를 사용하여 행을 삽입하거나 업데이트 [0]에서 예기치 않은 행 수를 반환하면

일괄 업데이트 문제 아래에 직면하게 될 것이다 최대 절전 모드로 전환 할 때; 실제 행 수 : 0; 예상 : 1

이 문제를 해결하려면 일괄 처리 배치를 무시해야합니다.

에서 당신이 봄 JPA에서 구성

hibernate.jdbc.factory_class = path.to.my.batcher.factory.implementation

이하로 사용 디스펜서 공장의 정의 구현을 제공 할 수있는 최대 절전 모드 당신은

hibernate.jdbc.batch.builder = path.to.my.batch.builder.implem 구성 이하로 사용하여 배치 빌더의 사용자 정의 구현하여 동일한을 달성 할 수 entation

+2

는 Incase의 당신은 당신이 내 블로그 https://anilagrawal038.wordpress.com/2016/12/11/custom-batch-builderbatch-in-spring-jpa/ –

+0

감사를 참조 할 수 있습니다 사용자 정의 배치를 구현해야 @쪽빛. Postgres DB에 대해이 구현을 성공적으로 사용 했습니까? 제안 된 솔루션을 사용하는 작은 작업 응용 프로그램을 사용하면 멋지게 느껴질 것입니다. – pastafarian

+0

@pastafarian 예, 저는 Postgres DB에서도 같은 것을 구현했습니다. 도와 드리겠습니다. 곧 샘플 앱을 공유하겠습니다. –