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

时间:2016-07-28 07:46:01

标签: java spring hibernate spring-mvc spring-data

我正在使用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. 
     }
}

请分享我可以通过哪种方法来改善此功能的性能。提前谢谢。

1 个答案:

答案 0 :(得分:1)

Hibernate有一个拦截器机制,可以让你在特定时间收到数据库事件发生时的通知。

此类事件是会话的创建/删除/刷新。当您访问受给定事件影响的对象时,如果修改了给定类的给定对象(您可以轻松映射到模式中的表),则可以触发进程。

可以在此处找到javadoc:https://docs.jboss.org/hibernate/orm/4.0/manual/en-US/html/events.html

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