我正在用Swing作爲GUI開發Java桌面應用程序。該應用程序包含每秒鐘從數據庫查詢以使數據庫同步界面的服務。我們都知道,用這種方式,表現是敵人。實現數據庫監聽器
我想要實現的是,通過psql(Postgres命令行)更改數據庫所做的每個更改,例如,應該通知我的應用程序更新UI。這樣,性能可能會得到優化。
謝謝!
我正在用Swing作爲GUI開發Java桌面應用程序。該應用程序包含每秒鐘從數據庫查詢以使數據庫同步界面的服務。我們都知道,用這種方式,表現是敵人。實現數據庫監聽器
我想要實現的是,通過psql(Postgres命令行)更改數據庫所做的每個更改,例如,應該通知我的應用程序更新UI。這樣,性能可能會得到優化。
謝謝!
正如@a_horse_with_no_name所指出的那樣,PostgreSQL支持異步通知通道。
您應該create a trigger,可能在plpgsql,在您希望監視的表上。這個觸發器fires a NOTIFY
當表更改時,可選地包括更改的數據其自身。
通知通道上的應用程序LISTEN
和processes any asynchronous notifications it receives。
請注意,發送空查詢是有效的,您應該這樣做而不是SELECT 1
。例如:
stmt.execute("");
IIRC即使這是可選的,如果你不使用SSL,有一種方法可以純粹的客戶端輪詢。但我不記得它是什麼,所以這不是真正有用的。
您可以確定使用觸發器維護的更改列表表格或使用通知上的有效內容確切更改了哪些內容。或者如果它很小,您可以簡單地重新閱讀整個表格。
這就是我所需要的。謝謝!在指定的表下創建觸發器在Postgres中是一件好事。我現在意識到這可以節省大量的開發和性能時間。每秒查詢一次會導致連接池中氾濫。但從技術上講,我還不知道觸發器是否有缺點。也許我會檢查是否有。 – 2014-10-08 04:18:32
@EriezeLagera一個只發送一個「NOTIFY」的觸發器非常輕便。如果您維護一個更改歷史記錄表,它會更貴一些,但仍然不是很激烈。 – 2014-10-08 04:28:32
到目前爲止你做了什麼?當你說'數據庫'時,你說數據在你的數據庫或你的數據庫的結構? – AndreDuarte 2014-10-07 16:28:09
您的要求非常模糊。您是否想要捕捉任何更改,包括由psql等外部事件引起的更改,還是通過某些中央服務器應用程序完成的更改? – radai 2014-10-07 16:29:12
http://jdbc.postgresql.org/documentation/head/listennotify.html – 2014-10-07 16:36:15