코드에서 높은 제네릭을 달성합니다
트랜잭션 데이터를 복사하기위한 매우 일반적인 도구 구축
몇 년 전, 나는 트랜잭션 데이터를 한 환경에서 다른 환경으로 복사하는 도구를 구축하기 시작했습니다. 단일 트랜잭션은 350 개 이상의 테이블에 걸쳐있을 수 있지만 모든 트랜잭션이 모든 테이블을 사용한 것은 아닙니다. 다른 트랜잭션 유형은 이러한 테이블의 다른 하위 집합을 만질 것입니다.
이러한 복잡성을 감안할 때, 이것을 Java로 코딩하는 것은 대규모 사업처럼 보였습니다. 주말에하고 싶었던 것은 내 애완 동물 프로젝트였습니다. 다른 중요한 프로젝트 외에도 바로 가기를 찾아 코드의 재사용 가능성을 높여야했습니다.
도전?
- 글쓰기 10 만 개 이상의 코드 라인 개별 테이블 읽기 및 인서트를 처리합니다.
- 이 코드를 그대로 유지합니다 테이블 구조는 자주 변경되었습니다 거의 매월 새로운 기능을 추가합니다.
- 그들이 의존하는대로 핵심 값이 올바르게 생성되도록 오라클 시퀀스 직접 사본보다는.
- 수동 노력, 복잡성 및 장기 유지 보수 최소화.
최소한의 코드가 필요한 솔루션이 필요하고 스키마 변경에 동적으로 적응할 수 있으며 지속적인 유지 보수를 제거했습니다.
첫 번째 시도 : 스크립트 및 데이터 펌프 유틸리티
처음에는 복잡한 쿼리를 지원하는 스크립트와 Oracle Data Pump 유틸리티를 사용하여 탐색했습니다. 이것은 실행 가능한 옵션처럼 보였지만, 나는 정치적 장애물을 쳤다. DB 팀은 DB가 아닌 DB 직원이 전용 DB 개발자에 의해 DB를 처리함에 따라 DB에 대한 아이디어를 시도 할 수있게하지 않았다. 대기업의 팀은 영토가 될 수 있으며 다른 방법을 찾아야했습니다.
획기적인 방법 : 매우 일반적인 접근
코드의 높은 재사용이 있도록 이것을 설계해야했습니다. 나는 나의 핵심 원칙 중 하나를 따랐다 일반성:
한 줄의 코드 라인을 작성하는 경우 함수 내부로 감싸서 재사용하십시오.
이를 염두에두고 메인 오케스트레이터 클래스, 몇 가지 지원 클래스 및 클래스 내부의 일부 지원 기능을 갖춘 두 기능을 중심으로 데이터베이스 작업을 구현 한 클래스를 사용하여 솔루션을 설계했습니다.
- 선택 쿼리를 실행하는 함수.
- 삽입 쿼리를 실행하는 함수.
350+ 테이블에 대한 개별 쿼리는 없으며 소수의 매우 일반적인 기능 만 있습니다! 그러나 일정한 수정을 피하기 위해 쿼리는 코드 외부에서 나와야했습니다.
구성 파일을 사용하여 동적 쿼리 생성
하드 코딩 쿼리 대신 구성 파일을 사용하여 모든 것을 구성했습니다.
- 올바른 삽입 시퀀스에 각 테이블에 대한 선택 설명이 포함되어 있습니다.
- 하위 쿼리를 사용하여 데이터를 기본 기본 키로 다시 관련 시켰습니다.
- 외국의 주요 관계가 동적으로 처리되도록 보장합니다.
- 테이블이 진화 할 때 코드 변경이 제거되었습니다. 구성 만 업데이트해야했습니다.
런타임에 스키마를 처리합니다
도구는 런타임에 동적으로 작동 했으므로 객체 모델에 의존 할 수 없었습니다. 그러나 그것은 문제가되지 않았습니다. 모든 결과 세트에는 필드 이름이 포함되어 동적 객체 모델링을 효과적으로 허용합니다.
다음 도전? 올바른 데이터 유형으로 데이터를 삽입합니다.
- Oracle의 Syscols, Syscolumns 및 기타 메타 데이터 테이블은 필드 세부 사항을 제공했습니다.
- 쿼리 실패를 방지하기 위해 데이터 유형을 올바르게 매핑했습니다.
- 얼룩, 클로브 및 기타 비표준 유형에 대한 특수 처리가 추가되었습니다.
이 접근법은 모든 테이블의 모든 필드를 반복하여 유형을 동적으로 결정하고 런타임에 올바른 삽입 문을 구성하는 것을 의미했습니다.
성능 병목 현상 및 최적화
첫 번째 달리기는 40 분이 걸렸으며 이것은 완전히 용납 할 수 없었습니다. 솔루션? 멀티 스레딩.
그러나 나는 멀티 스레드 프로그래밍을위한 또 다른 개인 원칙을 엄격히 따랐다.
진정한 병렬 실행을 원하는 경우 스레드간에 데이터 나 리소스를 공유하지 마십시오.
기존 구성 파일은 병렬 실행을 위해 구조화되지 않았으므로 i :
- 논리적으로 그룹화 된 테이블을 통해 독립적 인 실행이 가능합니다.
- 의존성없이 병렬로 실행하도록 설계된 스레드.
- 동시 작업에도 불구하고 데이터 무결성을 보장합니다.
이 구조 조정은 350+ 테이블 관계를 분석하는 데 시간이 걸렸지 만 지불금은 엄청났습니다. 실행 시간은 40 분에서 1 분 미만으로 떨어졌습니다!
연결 관리
Hikari Connection Pooling 또는 기타 유사한 JAR (이유를 기억할 수 없습니다)을 사용하지는 않았지만 수동으로 데이터베이스 연결을 처리하는 광범위한 C# 경험이있었습니다. 따라서 가벼운 연결 풀링 메커니즘을 구현했습니다.이를 새로 고치기 전에 제한된 수의 작업에 대한 연결을 열어 두었습니다. 이 연결 풀링이 제 사용 사례에 맞게 조정되어 더 유익하다는 것을 알았습니다.
충격 및 가치 전달
이 도구는 개발자와 QA 팀의 생산성을 크게 향상 시켰습니다.
- 테스트 데이터 설정 시간을 몇 시간에서 몇 분 단위로 크게 줄였습니다.
- 환경에서 테스트 시나리오를 쉽게 복제 할 수있었습니다.
- 코드를 수정하지 않고 스키마 변경에 동적으로 적응했습니다.
- 100,000+ 대신 ~ 5,000 줄의 코드 만 필요합니다. 95% 감소!
새 테이블이 추가 될 때마다 구성 파일에 한 줄만 추가되었습니다. 이 코드는 그대로 유지되지 않았습니다. 일반적인 유지 관리 가능한 소프트웨어 설계에서 진정한 승리입니다.
그렇습니다. 호기심 많은 사람들에게 UI는 AngularJS로 지어졌습니다.
최종 생각
이것은 내가 가장 좋아하는 애완 동물 프로젝트 중 하나였습니다. 나는 불필요한 작업을 제거하고 기술 부채를 줄이며 장기 가치를 극대화하는 솔루션을 설계하는 것을 좋아합니다.이 도구는 그 완벽한 예였습니다. 코드에는 응용 프로그램 별 구현이 없기 때문에 다른 응용 프로그램이있는 다른 그룹에 제공하고 싶었습니다. 구성 파일은 다른 데이터베이스이므로 변경이 필요했습니다.
또한 드롭 다운을 채우기 위해 새 데이터베이스를 가리키려면 연결 구성이 필요합니다. 따라서 기본적으로 Oracle DB 스키마를 사용하는 모든 팀이 사용할 수있는 제품이었습니다. 당신이 한두 가지를 배웠기를 바랍니다. 나는 항상 자부심과 만족감을 가지고 그것을 되돌아 봅니다.
나의 새로운 PET 프로젝트는 코드가없는 저 코드 디지털화 플랫폼입니다. 여기에서 확인하십시오.
Post Comment