我在用spring
,spring-data
,spring-cronjobs
and java-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......
}
以下是我用来在扫描数据库后触发邮件的示例 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 https://docs.jboss.org/hibernate/orm/4.0/manual/en-US/html/events.html
除了您的用例之外,我曾经在基于 Oracle 的分区模式中使用过拦截器。这个想法是使用技术日期对我们的一些表进行分区,挑战是给定树中的所有对象具有相同的“分区日期”(如果我们在插入时使用 SYSDATE,没有什么可以阻止对象树的一部分在第 N 天有一个分区日期,而树的其余部分在第 N+1 天......这在其他一些级别上是令人担忧的)。然后,使用拦截器在插入时沿着对象树传播相同的日期。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)