4

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

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

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)

我必须在两次通话之间睡一会儿吗?我宁愿不要在这里等待太久,因为我想让这个操作尽可能短,以便其他线程可以再次在表中写入。

或者有没有安全的方法来做到这一点?


编辑

是的,我正在寻找 SQL 语句的等效项:DELETE FROM tablename;在 Azure Tables 中使用尽可能少的 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

4 回答 4

9

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

您会收到 409(冲突),因为当代码请求创建同名的新表时,该表仍然存在。

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

除了等待(就像您所做的那样)或创建一个具有不同名称的表之外,我不知道有其他选择。

于 2012-06-28T14:12:38.093 回答
2

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

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

于 2012-06-28T15:50:23.253 回答
0

您不能使用一个删除 REST 调用来删除表吗?

于 2012-06-28T07:15:53.457 回答
0

您想要 SQLDELETE FROM table;TRUNCATE TABLE table;.

https://stackoverflow.com/a/8920072/15721说没有办法:(

于 2012-06-28T07:21:53.923 回答