4

私の問題は、ときどき Azure テーブルの内容を Javaから削除したいということです。テーブルには何百万もの行があるため、すべてのエンティティを 1 つずつ削除するのは適切な方法とは思えません (多数の 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)

2 ~ 2 回の通話の間にしばらく眠る必要がありますか? 他のスレッドがテーブルに再度書き込むことができるように、この操作をできるだけ短くしたいので、ここであまり長く待機しないでください。

または、これを行う安全な方法はありますか?


編集

はい、SQL ステートメントに相当するものを探していますDELETE FROM tablename;。REST API 呼び出しができるだけ少ない Azure テーブルで。

私の現在のベストショットは次のとおりです。

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

SQLDELETE FROM table;またはの等価物が必要TRUNCATE TABLE table;です。

https://stackoverflow.com/a/8920072/15721は、これには方法がないと言っています:(

于 2012-06-28T07:21:53.923 に答える
0

1 つの削除 REST 呼び出しを使用してテーブルを削除できませんか?

于 2012-06-28T07:15:53.457 に答える