2010-09-03 69 views
1

我面臨的特殊要求如下:
網絡密集型操作是由多個客戶端通過網絡接口觸發到服務器。但是,每次只允許執行一個操作,因此在SQL表中創建一個條目(元組)以指示操作正在進行中。一旦操作完成(無論成功或失敗),相應的結果將顯示回客戶端,並從SQL表中刪除相應的元組。
由於該操作是網絡密集型的,因此必須引入在某些超時(10分鐘)後需要「取消」操作以取消操作的情況。
是否有任何方式在SQL中的行的生命週期與超時值關聯,以便在一定的時間後被刪除?我的應用程序主要用Java 1.5和EJB 3.0編寫,使用JPA/Hibernate訪問Oracle 10g數據庫引擎。如何在超時後從SQL表中刪除元組?

在此先感謝。

問候,
Nagendra U m的

+0

你有沒有考慮過使用DBMS_LOCK來獲取一個命名鎖而不是數據庫表? – 2010-09-03 19:28:45

回答

0

我不知道甲骨文有這種設施,但我認爲沒有數據庫引擎有這個。

如果你想在數據庫級別做,

  1. 你必須有一個datetime列,例如; 'CreatedDate' in 表。當創建記錄時,該列將具有 日期時間。

  2. 編寫一個程序並將其放入 計劃作業中。該作業將在每10分鐘後運行並刪除10分鐘的舊記錄。查詢將如此 。

T-SQL:請根據您的數據庫引擎進行轉換。

DELETE FROM yourtable WHERE CreatedDate < DATEADD(mi, -10, GETDATE()) 

這將從表格中刪除超過10分鐘的所有記錄。

這只是給你一個計劃工作的想法。它在SQL Server中。我不知道甲骨文

step_by_step_guide_to_add_a_sql_job_in_sql_server_2005

0

這聽起來像你正在使用的數據庫中實現互斥,看看this question,看看是否有幫助?聽起來像交易訪問一個國旗表將爲您解決這個問題,只要您在服務器代碼中同時獲得成功&失敗狀態。

+0

確切!我的SQL表的目的是確保一次只有一個操作正在進行。但是,如果服務器沒有響應,即使很長時間後,我也需要一種方法來處理超時,以便我可以釋放要由其他客戶端完成的操作。即在10分鐘後從桌子上移除入口。如何才能做到這一點?通過本機SQL語句甚至JPA的任何方式?並且,感謝您的快速響應。 :-) – 2010-09-03 16:50:09

+0

你的交易可能是這樣讀的:'begin tran;如果不存在(從表中選擇1開始> = dateadd(mi,-10,getdate()))begin;插入表...,getdate();結束;提交「 - 無論是否或者任何進程決定停止運行網絡激烈操作,還會更新表格 – 2010-09-03 17:05:37

1

我建議您嘗試使用含有任務的開始時間的時間戳列。

A before如果任務超時,可以觸發刪除舊列,然後插入新列。

如果您想要擁有不同超時的多個任務,您甚至可以添加一個超時時間爲幾秒的列。相應地編寫你的觸發器。