Azure Cosmos DB の "見つかりません" 例外を診断してトラブルシューティングする
適用対象: NoSQL
HTTP 状態コード 404 は、リソースがもう存在しないことを表します。
正しい動作
アプリケーションでコード 404 が予期されていて、そのシナリオが正しく処理される有効なシナリオが多数あります。
存在しているはず、または実際に存在している項目に対して "見つかりません" 例外が返された
項目が存在しているはず、または実際に存在している場合に状態コード 404 が返される理由は、次のとおりです。
入力セッション トークンでは読み取りセッションを使用できません
解決方法:
- 現在の SDK を、入手できる最新版に更新します。 この特定のエラーの最も一般的な原因は最新版の SDK で解決されています。
競合状態
複数の SDK クライアント インスタンスがあり、書き込みの前に読み取りが発生しました。
解決方法:
- Azure Cosmos DB の既定のアカウント整合性は、セッション整合性です。 項目が作成または更新されると、応答により、セッション トークンが返されます。これを SDK インスタンス間で渡すことで、読み取り要求がその変更を含むレプリカから読み取っていることが保証されます。
- 整合性レベルをより強力なレベルに変更します。
コンテナーまたはデータベースのスループットを見る
PowerShell または Azure CLI で not found (見つかりません) というエラー メッセージが出る。
解決方法 :
スループットの情報は、データベース単位、コンテナー単位またはその両方で用意できます。 not found (見つかりません) というエラーが出る場合は、親データベース リソースまたは子コンテナー リソースでスループットの確認を試みてください。
パーティション キーと ID の組み合わせが無効
パーティション キーと ID の組み合わせが無効です。
解決方法:
不適切な組み合わせの原因となっているアプリケーション ロジックを修正します。
項目 ID に無効な文字がある
項目 ID に無効な文字を含む項目が Azure Cosmos DB に挿入されています。
解決方法:
ID を、特殊文字を含まない別の値に変更します。 ID を変更できない場合は、ID を Base64 でエンコードして特殊文字をエスケープすることができます。 Base64 からはそれでも、置換する必要がある無効な文字 "/" を含む名前が生成されることがあります。
その ID のコンテナーに既に挿入されている項目は、名前ベースの参照の代わりに RID 値を使用して置き換えることができます。
// Get a container reference that uses RID values.
ContainerProperties containerProperties = await this.Container.ReadContainerAsync();
string[] selfLinkSegments = containerProperties.SelfLink.Split('/');
string databaseRid = selfLinkSegments[1];
string containerRid = selfLinkSegments[3];
Container containerByRid = this.cosmosClient.GetContainer(databaseRid, containerRid);
// Invalid characters are listed here.
// https://video2.skills-academy.com/dotnet/api/microsoft.azure.documents.resource.id#remarks
FeedIterator<JObject> invalidItemsIterator = this.Container.GetItemQueryIterator<JObject>(
@"select * from t where CONTAINS(t.id, ""/"") or CONTAINS(t.id, ""#"") or CONTAINS(t.id, ""?"") or CONTAINS(t.id, ""\\"") ");
while (invalidItemsIterator.HasMoreResults)
{
foreach (JObject itemWithInvalidId in await invalidItemsIterator.ReadNextAsync())
{
// Choose a new ID that doesn't contain special characters.
// If that isn't possible, then Base64 encode the ID to escape the special characters.
byte[] plainTextBytes = Encoding.UTF8.GetBytes(itemWithInvalidId["id"].ToString());
itemWithInvalidId["id"] = Convert.ToBase64String(plainTextBytes).Replace('/', '!');
// Update the item with the new ID value by using the RID-based container reference.
JObject item = await containerByRid.ReplaceItemAsync<JObject>(
item: itemWithInvalidId,
ID: itemWithInvalidId["_rid"].ToString(),
partitionKey: new Cosmos.PartitionKey(itemWithInvalidId["status"].ToString()));
// Validating the new ID can be read by using the original name-based container reference.
await this.Container.ReadItemAsync<ToDoActivity>(
item["id"].ToString(),
new Cosmos.PartitionKey(item["status"].ToString())); ;
}
}
Time to Live 消去
項目に、Time to Live (TTL) プロパティが設定されていました。 TTL プロパティの期限が切れたため、項目は消去されました。
解決方法:
項目が消去されないようにするには、TTL プロパティを変更します。
Lazy インデックス作成
Lazy インデックス作成が追い付いていません。
解決方法:
インデックス作成が追い付くまで待つか、インデックス作成ポリシーを変更します。
親リソースが削除された
項目が存在するデータベースやコンテナーが削除されました。
解決方法:
- 親リソースをバックアップから復元するか、リソースを再作成します。
- 新しいリソースを作成して、削除されたリソースを置き換えます。
7.コンテナーおよびコレクション名は、大文字と小文字が区別されます。
Azure Cosmos DB では、コンテナーおよびコレクション名の大文字と小文字が区別されます。
解決方法:
Azure Cosmos DB に接続するときは、必ず正確な名前を使用してください。
次のステップ
- Azure Cosmos DB .NET SDK 使用時の問題を診断してトラブルシューティングする。
- .NET v3 と .NET v2 のパフォーマンス ガイドラインを確認する。
- Azure Cosmos DB Java v4 SDK 使用時の問題を診断してトラブルシューティングする。
- Java v4 SDK のパフォーマンス ガイドラインを確認する。