2012-06-28 40 views
4

我的問題是,我不時想刪除來自Java的Azure表的內容。該表擁有數百萬行,因此它似乎不是逐個刪除所有實體的好方法(因爲有很多REST API調用)。Azure Tables刪除並創建表失敗

我試圖刪除,然後再次創建表,但我的代碼失敗。

getTableClient().deleteTableIfExists("tablename"); 
getTableClient().createTableIfNotExists("tablename"); 

這裏是我的堆棧跟蹤:

com.microsoft.windowsazure.services.table.client.TableServiceException: Conflict 
at com.microsoft.windowsazure.services.table.client.TableServiceException.generateTableServiceException(TableServiceException.java:57) 
at com.microsoft.windowsazure.services.table.client.TableOperation$2.execute(TableOperation.java:339) 
at com.microsoft.windowsazure.services.table.client.TableOperation$2.execute(TableOperation.java:322) 
at com.microsoft.windowsazure.services.core.storage.utils.implementation.ExecutionEngine.executeWithRetry(ExecutionEngine.java:110) 
at com.microsoft.windowsazure.services.table.client.TableOperation.performInsert(TableOperation.java:374) 
at com.microsoft.windowsazure.services.table.client.TableOperation.execute(TableOperation.java:551) 
at com.microsoft.windowsazure.services.table.client.CloudTableClient.execute(CloudTableClient.java:638) 
at com.microsoft.windowsazure.services.table.client.CloudTableClient.createTable(CloudTableClient.java:173) 
at com.microsoft.windowsazure.services.table.client.CloudTableClient.createTableIfNotExists(CloudTableClient.java:251) 
at com.microsoft.windowsazure.services.table.client.CloudTableClient.createTableIfNotExists(CloudTableClient.java:197) 

我必須一會兒之間睡覺兩個電話?我寧願在這裏等待,因爲我希望儘可能縮短這個操作的時間,以便其他線程可以在表中再次寫入。

還是有安全的方法來做到這一點?在Azure中的表使用盡可能少的REST API調用盡可能DELETE FROM tablename;


編輯

是的,我正在尋找的SQL語句的等效。

我目前最好的拍攝是:

getTableClient().deleteTableIfExists("tablename"); 
// TODO: solve problem with new creation! 
boolean success = false; 
while (!success) { 
try { 
    success = getTableClient().createTableIfNotExists("tablename"); 
} catch (StorageException e) { 
    System.err.println("Log table recreation failed retrying in 5 sec"); 
    try { 
    Thread.sleep(5000); 
    } catch (InterruptedException ex) {} 
} 

我找一個更好,更安全的解決方案,然後這個!

+0

不,你正在尋找SQL Drop Table。您不希望被實體(行)刪除,因爲這可能是多個(結算)事務。刪除表是一個事務。 – Paparazzi

回答

8

對Windows Azure的表中的刪除操作是不是一個即時操作。當刪除請求發出後,它是由存儲服務,並且不再標記爲刪除可能需要在後臺刪除(垃圾收集),這可能需要幾秒鐘的時間才能完成

您會得到一個409(衝突),因爲當代碼請求新的表時,表仍然存在表被創建爲相同的名稱。

請參閱備註區域n(頁面底部)的MSDN文檔http://msdn.microsoft.com/en-us/library/windowsazure/dd179387.aspx

除了等待(像你已經完成)或創建一個不同名稱的表,我不知道替代。

+2

這很可能是發生了什麼事情。實際上,您應該在線路上收到錯誤消息,表示該表格也將被刪除。你會看到它在一個.NET客戶端的異常,不知道爲什麼你沒有看到它在Java客戶端。此外,大型表格可能需要很多*分鐘*(而不是數秒)才能被垃圾收集。對於非常大的桌子,我在某些情況下看過40分鐘以上。 – dunnry

0

你不能使用一個刪除REST調用delete a table

+0

我確實使用一次調用來刪除表...而另一次再次添加它。正如@Will指出的,我的目標是從表中刪除所有數據。它在Azure表API中沒有等效。 – hpityu

+0

啊我看到我誤解了你的問題,看起來像它不可能atm,也許有一天可能更新這個答案。 – tsukimi

0

您希望得到SQL DELETE FROM table;TRUNCATE TABLE table;的等值。

https://stackoverflow.com/a/8920072/15721說,有沒有辦法這個:(

+0

這正是我想要做的。這就是爲什麼我要刪除並重新創建表格。我不明白的是爲什麼我在順序執行這些時遇到衝突。 – hpityu

2

@mcollier對這裏的原因是正確的,但我想指出一個可能的解決方案。每當我們面對一個我們知道我們會有大量想要偶爾修剪的表格數據的場景時,我們通過滾動表格來設計它。因此,我們定期增加表名或將其中的日期存入日常數據(例如logs20120628)。然後我們可以在不影響當前表的情況下刪除整個表,或者在我們重新創建表之前強制等待(有時等待非常長的時間)。

只需在表格命名中設計一點靈活性,這對您而言不是什麼大問題。