私の問題は、ときどき 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) {}
}
これよりも優れた安全なソリューションを探しています!