如何使用Spring动态跟踪数据库更改?


问题内容

我使用springspring-dataspring-cronjobsjava-mail。我需要立即扫描my- sql数据库中存在的表中的更改,并将有关更改的邮件发送给管理员。

我要做的所有工作都是运行cronjob来扫描表中的所有更改,但这是一个繁重的过程,因为表与货币交易有关,并且消耗大量资源,因此应用程序变得太慢。

因此,是否有更好的过程可用来跟踪数据库中的当前更改。例如,如果有任何方法可以在spring设置观察者以触发数据库更改过程,则将很有帮助。

以下是我正在扫描的表的实体的示例。

/** 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......
}

以下是我用来扫描数据库后启动邮件的示例cron作业。

/** 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. 
     }
}

请分享我可以改善此功能性能的任何方法。提前致谢。


问题答案:

Hibernate具有拦截器机制,可让您在特定时间发生数据库事件时得到通知。

此类事件是会话的创建/删除/刷新。当您访问受给定事件影响的对象时,您就有办法在修改给定类的给定对象(可以轻松映射到架构中的表)时触发一个过程。

可以在以下位置找到Javadoc:https//docs.jboss.org/hibernate/orm/4.0/manual/en-
US/html/events.html

除了您的用例之外,我还曾在基于Oracle的分区模式中使用拦截器。想法是使用一个技术日期来对某些表进行分区,而挑战在于给定树中的所有对象都具有相同的“分区日期”(如果我们在插入时使用了SYSDATE,那么什么也不会阻止对象树的一部分在第N天有一个分区日期,而树的其余部分在第N
+ 1天……这在其他一些级别上令人担忧。然后,使用拦截器在插入时沿对象树传播相同的日期。