2016-07-28 3 views
0

spring, spring-data, spring-cronjobsjava-mail을 사용하고 있습니다. 나는 즉시 테이블에있는 변경 사항을 my-sql 데이터베이스에 스캔하고 변경 사항과 관련하여 관리자에게 메일을 보내야한다는 요구 사항이 있습니다.봄을 사용하여 데이터베이스 변경 사항을 동적으로 추적하는 방법은 무엇입니까?

내가 이것을 달성하기 위해하고있는 것은 테이블의 모든 변경 사항을 검사하는 cronjob을 실행하는 것입니다. 그러나 테이블이 금전적 인 트랜잭션과 관련되어 있고 많은 자원을 응용 프로그램으로 사용하므로 무거운 프로세스입니다 너무 느립니다.

그래서 데이터베이스의 현재 변경 사항을 추적 할 수있는 더 나은 프로세스가 있습니까? 예를 들어, 봄에 관찰자를 설정하여 데이터베이스 변경 프로세스를 시작하는 방법이 있다면 도움이 될 것입니다.

다음은 내가 스캔중인 테이블의 엔티티 샘플입니다.

/** Import statements **/ 

@Entity 
public class UserWalletTransaction { 

    @Id 
    @GeneratedValue 
    private Long Id; 
    private String toAccount; 
    @ManyToOne(fetch = FetchType.LAZY) 
    User user; 
    @ManyToOne(fetch = FetchType.LAZY) 
    Wallet wallet; 
    private String senderOrMobile; 
    private String benificiaryName; 
    private String beniMobile; 
    private Double transferAmount; 
    private Double sTax; 
    private Double charge; 
    private Double netAmount; 
    private String apiTId; 
    private String apiComment; 
    private String agentId; 
    private Double apiSTax; 
    private Double apiCharge; 
    private Double apiNetAmount; 
    private Double apiBalanceAmount; 
    private String transactionMode; 
    private String bankName; 
    private String userTrackId; 
    private String referenceNumber; 
    private String operatorDescription; 
    private String mobileNumber; 
    private String rechargeDateTime; 
    private String operatorTransactionId; 
    private String hermesPnr; 
    private String utId; 
    private String status; 
    private Double previousAmount; 
    private Double balanceAmount; 
    private Double amountTransacted; 
    private String transactionType; 
    private boolean isRaised; 
    private boolean isRefunded; 
    @Column(name = "created_by") 
    private String createdBy; 
    @Column(name = "created_date") 
    private Date createdDate; 
    @Column(name = "updated_by") 
    private String updatedBy; 
    @Column(name = "updated_date") 
    private Date updatedDate; 
    private String operationPerformed; 
    @OneToOne 
    private UserWalletTransaction relationalTransaction; 
    private String errorComments; 
    @OneToOne 
    private User debitUser; 
    @OneToOne 
    private User creditUser; 
    @OneToOne 
    private ServiceProvider serviceProvider; 
    @OneToOne 
    private RefundRequest refundRequests; 

    ..... Getters and setters...... 
} 

그리고 다음은 데이터베이스 스캔 후 메일을 실행하는 데 사용하는 샘플 크론 작업입니다.

/** Import statements **/ 
@Component 
@EnableScheduling 
public class ValidateCron { 
    @Autowired 
    RechargeService rechargeService; 
    @Scheduled(fixedDelay = 2) 
    public void demoServiceMethod() { 
     // Perform tasks related to scan and track the number of records added //after the previous scan. Fire a mail if any change in the database is found. 
    } 
} 

이 기능의 성능을 향상시킬 수있는 방법을 알려주십시오. 미리 감사드립니다.

+2

최대 절전 모드 인터셉터를 둘러 보셨습니까? https://docs.jboss.org/hibernate/orm/4.0/manual/en-US/html/events.html – GPI

+0

정보를 제공해 주셔서 감사합니다. 이것은 도움이 될 것 같습니다. 나는 몇 가지 예를 시도 할 것이다. 몇 가지 예를 들어 주시면 도움이 될 것입니다. –

+0

왜이 용도로 방아쇠를 사용하지 않습니까? 매번 테이블을 스캔하는 것보다 더 나은 솔루션 인 것 같습니다. –

답변

1

Hibernate는 데이터베이스 이벤트가 발생할 때 특정 시간에 통지를받을 수있는 인터셉터 메카니즘을 가지고 있습니다.

이러한 이벤트는 세션의 생성/삭제/삭제입니다. 주어진 이벤트의 대상이되는 객체에 대한 액세스 권한을 얻으면 주어진 클래스의 지정된 객체 (스키마의 테이블에 쉽게 매핑 할 수 있음)가 수정 될 때 프로세스를 시작해야합니다.

javadoc의

는 여기에서 찾을 수 있습니다 : https://docs.jboss.org/hibernate/orm/4.0/manual/en-US/html/events.html 사용 사례에서 별도로

, 한번 사용 인터셉터를 오라클 기반 partitionned 스키마에. 아이디어는 기술적 인 날짜를 사용하여 일부 테이블을 분할하는 것이 었습니다. 주어진 트리의 모든 개체에 대해 동일한 "파티션 날짜"를 지정하는 것이 어려웠습니다 (삽입시 SYSDATE를 사용하면 아무 것도 방지 할 수 없습니다). 오브젝트 트리의 한 부분은 N 일에 파티션 날짜를 가지며 N + 1 일에 트리의 나머지 부분은 다른 레벨에서 걱정됩니다). 인터셉터를 사용하여 삽입시 오브젝트 트리를 따라 동일한 날짜를 전파했습니다.

+0

GPI에 감사드립니다. 이것은 제 문제를 해결하는 데 도움이되었습니다. –

관련 문제