我有一個用PLJava編寫的程序,它通過我的postgres數據庫中的JMS發送更新。數據庫作業調度
我想要做的是在數據庫內部(最好不是從外部進程)在一個時間間隔(每15秒)調用一次該函數。這可能嗎?有任何想法嗎?
我有一個用PLJava編寫的程序,它通過我的postgres數據庫中的JMS發送更新。數據庫作業調度
我想要做的是在數據庫內部(最好不是從外部進程)在一個時間間隔(每15秒)調用一次該函數。這可能嗎?有任何想法嗎?
如果您不需要外部訪問,那麼您大概可以修改數據庫設計,以便根本不需要更新。你能解釋更多關於更新的內容嗎?
正如depesz所說,你可以使用cron或pgAgent,但它們只能下降到1分鐘的粒度,而不是15秒。考慮到在存儲過程中進行睡眠,直到下一次迭代不是一個好主意,因爲你將在所有時間都有一個打開的事務,這是一個非常糟糕的主意。
嚴格回答:這是不可能的。既然你不想要外部過程,而PostgreSQL不支持工作 - 你運氣不好。
如果你會重新考慮使用外部流程,那麼你很可能想要類似cron的東西,或者更好的辦法。
絕對另一方面 - 你需要做什麼,每30秒發生一次?這似乎是一個設計問題。
我使用用PL/Java的一個存儲過程沖洗掉數據庫表(更新)作爲Java對象每隔15秒 – systemoutprintln 2010-01-05 00:11:28
聽起來像你在做複製?每15秒聽起來像很多更新。你可以設置一個觸發器(或一些觸發器)而不是輪詢?
首先,如果您只是使用cron作業,您將花費最少的精力。
但是,如果您是從scracth開始的:您正試圖從數據庫中定期複製行。我認爲你正在尋找一個複製隊列。
PGQ項目(用於Londiste複製,均來自Skype的SkyTools)有一個可以獨立使用的隊列。當configuring it時,您會在生成批處理事件之前設置最大事件計數和循環延遲。您可以以這種方式間隔不超過15秒。您現在必須使用一個調用pgq.insert_event的觸發器來產生將被批量處理的事件;並消耗隊列。消費者可以調用你的PL/Java存儲過程;您必須重寫該過程才能在批處理中發送所有內容,而不是掃描基本表中的新事件。
「你會得到最少的工作」對我來說還不清楚。 – 2010-01-10 01:36:34
「除了已經完成的工作之外,還有很少的工作」,那會更好嗎? – Tobu 2010-01-10 01:58:43
如何「如果你只是做一個cron工作,你就不需要做太多的工作」 – 2010-01-10 15:09:31
如果您正在使用JMS,爲什麼不只是等待隊列上的輸入?
根據你的 depesz評論,你有一個PL/Java存儲過程,「刷新數據庫表(更新)爲java對象」。由於您希望它以15秒的間隔運行,因此它每次都必須處理一批更新。而不是每隔15秒在存儲過程中處理一批更新,爲什麼不通過更新後觸發器一次處理它們,而不需要定時間隔。如果您正在彙總多個表中的數據以構建對象,則只能將觸發器添加到最上方的表中。
您可以通過運行一個作業,每分鐘做的每15秒cron的東西,將(DoSomething的:睡眠15 ; dosomething:sleep 15; dosomething:sleep 15;) – bortzmeyer 2010-01-09 20:46:57