2016-07-28 48 views
0

我使用的是spring,spring-data,spring-cronjobsjava-mail。我要求立即扫描my-sql数据库中的表中的更改,并向管理员发送关于更改的邮件。如何使用spring动态跟踪数据库更改?

我正在做的所有事情是通过运行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...... 
} 

而以下是我用于扫描数据库后触发邮件的示例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. 
    } 
} 

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

+2

你有没有试过绕过hibernate拦截器? 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

从你的使用情况

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

+0

好的,谢谢GPI,这有助于解决我的问题。 –