Azure表删除和创建表失败

时间:2012-06-28 07:08:45

标签: java azure azure-table-storage

我的问题是我不时想从Java中删除Azure表的内容。该表有数百万行,因此它似乎不是逐个删除所有实体的好方法(因为有许多REST API调用)。

我尝试删除然后再次创建表,但我的代码失败了。

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

这是我的stacktrace:

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表中的SQL语句等效的DELETE FROM tablename;,尽可能少的REST API调用。

我目前最好的镜头是:

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) {}
}

我正在寻找更好更安全的解决方案!

4 个答案:

答案 0 :(得分:9)

针对Windows Azure表的删除操作不是即时操作。发出删除请求时,存储服务会将其标记为删除,客户端不再可以访问。然后在后台删除该表(垃圾收集)。这可能需要几秒钟才能完成。

你得到的是409(冲突),因为当代码请求创建一个同名的新表时,该表仍然存在。

请参阅http://msdn.microsoft.com/en-us/library/windowsazure/dd179387.aspx处的MSDN文档的“备注”部分(页面底部)。

除了等待(就像你已经完成)或创建一个具有不同名称的表格,我不知道另一种选择。

答案 1 :(得分:2)

@mcollier在这里的原因是正确的,但我想指出一个可能的解决方案。每当我们面对一个我们知道我们想要偶尔修剪大量表数据的场景时,我们就会通过滚动表来设计它。因此,我们会定期递增表名或将日期放入日常数据中(例如logs20120628)。然后我们可以删除整个表,只要我们不再需要那些数据而不影响当前表或被迫等待(有时很长时间等待),直到我们可以重新创建表。

只需在表格命名中设计一点灵活性,这对您来说不是一个大问题。

答案 2 :(得分:0)

你不能使用一个删除REST调用delete a table吗?

答案 3 :(得分:0)

您想要等同于SQL DELETE FROM table;TRUNCATE TABLE table;

https://stackoverflow.com/a/8920072/15721说没有办法解决这个问题:(