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

标签 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. 
     }
}

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

最佳答案

Hibernate 有一个拦截器机制,允许您在数据库事件发生时的特定时间得到通知。

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

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

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

关于java - 如何使用 spring 动态跟踪数据库更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38630114/

相关文章:

java - 不能使用 try/catch block 处理 java 未经检查的异常吗?

java - 将 xml 从 String 添加到 DOMElement

java - TestNG @DataProvider 返回动态类

spring - Ehcache 与 Hibernate 和 Spring 的集成异常 : Second-level cache is not enabled for usage

java - Spring 安全: Who passes the AuthenticationManagerBuilder to the WebSecurityConfigurerAdapter configure method?

java - org.hibernate.exception.JDBCConnectionException : Error calling DriverManager#getConnection

java - 动态读取 Hibernate 配置

java - 我如何将一个 bean 合并到另一个 bean 中以进行部分更新

hibernate - Seam - 通过 (Session)em.getDelegate() 获取连接;

使用现有的@TableGenerator 进行 Hibernate 4 到 5 迁移