第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

字段更改的休眠審計日志

字段更改的休眠審計日志

米琪卡哇伊 2022-06-04 14:58:50
如何將實體的更改記錄到日志文件中?考慮我有Person這樣的。import org.hibernate.envers.Audited;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.GeneratedValue;import javax.persistence.Column;@Entity@Auditedpublic class Person {    @Id    @GeneratedValue    private int id;    private String name;    private String surname;// add getters, setters, constructors, equals and hashCode here}和改變現(xiàn)有的代碼PersonPerson p1 = new Person("name-1", "surname-1");personRepository.save(p1);Person p2 = personRepository.findOne(1L);p2.setName("new-name");personRepository.save(p2);我怎么能有舊實體新實體字段列表已更改(類似于Diffable的結果)在我的日志文件中?我知道envars可以將更改存儲在 db 中并讓我稍后提取它們,AuditReader但我喜歡將更改存儲在 Json 文件中以將它們發(fā)送到第三方應用程序(如 Elastic)。
查看完整描述

2 回答

?
回首憶惘然

TA貢獻1847條經(jīng)驗 獲得超11個贊

我實際上會從兩個角度來解決這個問題。


使用 Envers 獲得的好處之一是您可以非??焖俚刈⑨屇膶嶓w并準確告訴框架您希望如何跟蹤實體模型的更改。更好的是,您可以讓 Envers 自動為您生成 diffable 字段。


讓我們來看看這個基本實體:


@Entity

@Audited(withModifiedFlag = true)

public class Person {

  @Id

  @GeneratedValue

  private Integer id;

  private String name;

}

當您啟用該withModifiedFlag功能時,這會通知 Envers 將一些額外的元數(shù)據(jù)列添加到該實體的審計表中,因此該實體的審計表基本上如下所示:


+----+------+----------+-----+---------+

| ID | name | name_MOD | REV | REVTYPE |

+----+------+----------+-----+---------+

這樣做的好處是,如果您使用某些流程直接從表中導出和流式傳輸數(shù)據(jù),您不再需要實際區(qū)分當前行與前一行來了解發(fā)生了什么變化;只需查看關聯(lián)的_MOD列是1(true) 還是0(false),模式就會自動告訴您這一點。


從這一點開始,您有幾個選擇。


本機查詢 ETL

您可以使用 Hibernate 本機查詢通過某個后臺應用程序線程或單獨的后臺進程來提取數(shù)據(jù)并將其轉(zhuǎn)換為 ES 的 JSON。由于該_MOD列為您提供了字段更改的指示符,因此您可以輕松讀取行并構建必要的數(shù)據(jù),而無需在提取時執(zhí)行差異操作。


我還建議配置 Envers 以將審計對象放在單獨的目錄/模式中。這最大限度地提高了數(shù)據(jù)庫同時改進跨多個數(shù)據(jù)庫的磁盤 IO 的能力。


Debezium ETL

Debezium 項目是處理數(shù)據(jù)復制的絕佳方式。它的強大優(yōu)勢之一是它使用戶能夠跨完全適合您的模型的異構平臺執(zhí)行此操作。


這里最大的區(qū)別是 Debezium 不直接讀取數(shù)據(jù)庫來確定更改,而是讀取數(shù)據(jù)庫事務日志文件并生成一系列事件來描述針對該數(shù)據(jù)庫發(fā)生的 DML 操作。簡而言之,您避免了您非常關心的讀取操作,因為 Debezium 直接從事務日志中重新水化狀態(tài)。

舉個例子:

  1. 休眠執(zhí)行INSERT INTO Person (?,?) VALUES (?,?)。

  2. Hibernate Envers 執(zhí)行INSERT INTO Person_AUD (...) VALUES (....)

  3. 數(shù)據(jù)庫將該操作寫入重做/事務日志。

  4. Debezium 注意到日志已寫入,然后讀取條目。

  5. Debezium 為Person_AUD(訂閱的表)生成一個插入事件。

  6. 該事件的任何注冊相關方都會收到并處理它。

在 (5) 中,您的轉(zhuǎn)換/加載代碼將存在以接收該插入事件并生成 JSON 輸出并將其發(fā)送到 ES。

包起來

通過使用 Debezium,您能夠以極其高效的方式有效地離線復制異構環(huán)境中的數(shù)據(jù)。該項目不僅非常適合您的用例,而且在當今微服務架構的現(xiàn)代世界中非常有價值,其中服務之間的數(shù)據(jù)共享至關重要。

通過使用 Envers,您能夠提供在線回退解決方案,在您的 ES 集群不可用或過載時為用戶提供審計歷史數(shù)據(jù),而不是給用戶一個“服務不可用,稍后再回來”的響應。

無論您做出什么決定,性能都不是唯一令人擔憂的因素。您還應該注意用戶體驗、可擴展性和可靠性;因此,為什么我認為最佳解決方案是將兩者配對。


查看完整回答
反對 回復 2022-06-04
?
互換的青春

TA貢獻1797條經(jīng)驗 獲得超6個贊

您可以通過實現(xiàn)來編寫自定義攔截器org.hibernate.EmptyInterceptor。這具有使用實體的新舊快照更新/插入/刪除的回調(diào)。

有關更多詳細信息,請參閱本文


查看完整回答
反對 回復 2022-06-04
  • 2 回答
  • 0 關注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號