2016-07-28 14 views
0

Ich verwende spring, spring-data, spring-cronjobs und java-mail. Ich habe die Anforderung, die Änderungen in einer Tabelle, die in der my-sql-Datenbank vorhanden ist, sofort zu scannen und eine E-Mail an den Administrator bezüglich der Änderungen zu senden.Wie können Datenbankänderungen mithilfe von Feder dynamisch nachverfolgt werden?

Alles, was ich tue, um dies zu erreichen, ist einen Cronjob auszuführen, um alle Änderungen in der Tabelle zu scannen, aber es ist ein schwerer Prozess, da die Tabelle mit monetären Transaktionen verbunden ist und die Anwendung viele Ressourcen verbraucht wird zu langsam.

Also, gibt es einen besseren Prozess, mit dem ich die aktuellen Änderungen in der Datenbank verfolgen kann. Zum Beispiel Wenn es eine Methode gibt, Beobachter im Frühling einzustellen, um einen Prozess beim Datenbankwechsel auszulösen, wäre es hilfreich.

Folgendes ist ein Beispiel für die Entität der Tabelle, die ich scanne.

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

Und das folgende Beispiel ist ein Cron-Job, den ich benutze, um die Mail nach dem Scannen der Datenbank zu feuern.

Bitte teilen Sie jede Methode, mit der ich die Leistung dieser Funktionalität verbessern kann. Danke im Voraus.

+2

Haben Sie versucht, sich im Ruhezustand Abfangjäger zu suchen? https://docs.jboss.org/hibernate/orm/4.0/manual/en-US/html/events.html – GPI

+0

Danke für die Info. Dies scheint hilfreich zu sein. Ich werde einige Beispiele ausprobieren. Wenn Sie bitte einige Beispiele angeben können, wäre es hilfreich. –

+0

Warum benutzen Sie nicht einfach einen Auslöser dafür? Scheint eine bessere Lösung zu sein, als jedes Mal die Tabelle zu scannen. –

Antwort

1

Hibernate verfügt über einen Interceptor-Mechanismus, mit dem Sie zu bestimmten Zeiten benachrichtigt werden können, wenn Datenbankereignisse auftreten.

Solche Ereignisse sind das Erstellen/Löschen/Leeren der Sitzung. Wenn Sie Zugriff auf die Objekte erhalten, die dem gegebenen Ereignis unterliegen, haben Sie ein Mittel, einen Prozess auszulösen, wenn ein gegebenes Objekt einer bestimmten Klasse (das Sie leicht einer Tabelle in Ihrem Schema zuordnen können) geändert wird. https://docs.jboss.org/hibernate/orm/4.0/manual/en-US/html/events.html

Neben Ihrem Anwendungsfall, ich einmal verwendet Abfangjäger in einem Oracle-Basis, partitionned Schema:

Die javadoc ist hier zu finden. Die Idee war, ein technisches Datum zu verwenden, um einige unserer Tabellen zu partitionieren, und die Herausforderung bestand darin, das gleiche "Partitionierungsdatum" für alle Objekte in einem gegebenen Baum zu haben (wenn wir SYSDATE zum Zeitpunkt des Einfügens verwendet hätten, würde nichts verhindern ein Teil des Objektbaums hat ein Partitionsdatum am Tag N und der Rest des Baumes am Tag N + 1 ... was auf einigen anderen Ebenen unangenehm ist). Ein Interzeptor wurde dann verwendet, um das gleiche Datum beim Einfügen entlang des Objektbaums zu verbreiten.

+0

Ok danke GPI, das half mir bei der Lösung meines Problems. –