Java'da DynamoDB Scan (AWS SDK v2)
Scan, bir tablo veya indekteki her öğeyi sayfa sayfa okur, ardından isteğe bağlı olarak bir FilterExpression ile satırları eler. Java 2.x için AWS SDK'da bir ScanRequest oluşturur ve yerleşik scanPaginator'ın tablonun tamamı okunana kadar LastEvaluatedKey'i takip etmesini sağlarsınız.
Code
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.ScanRequest;
import software.amazon.awssdk.services.dynamodb.model.ScanResponse;
public class ScanExample {
public static void main(String[] args) {
try (DynamoDbClient ddb = DynamoDbClient.builder()
.region(Region.US_EAST_1)
.build()) {
Map<String, String> names = new HashMap<>();
names.put("#filter0", "Year");
Map<String, AttributeValue> values = new HashMap<>();
values.put(":filterValue0", AttributeValue.builder().n("2010").build());
ScanRequest request = ScanRequest.builder()
.tableName("Music")
.filterExpression("#filter0 >= :filterValue0")
.expressionAttributeNames(names)
.expressionAttributeValues(values)
.build();
List<Map<String, AttributeValue>> items = new ArrayList<>();
for (ScanResponse page : ddb.scanPaginator(request)) {
items.addAll(page.items());
}
System.out.println("Matched " + items.size() + " items");
} catch (DynamoDbException e) {
System.err.println(e.getMessage());
}
}
}Açıklama
filterExpression— okumadan sonra, sunucuda uygulanır. Yanıtı küçültür ama maliyeti değil: filtrelenmiş olsun ya da olmasın, taranan her öğeyi okumak için ödeme yaparsınız.expressionAttributeNames— filtrelenen öznitelik bir takma ad alır (#filter0→Year); bu daYeargibi ayrılmış sözcükleri güvende tutar.- Sayfalama — her
Scansayfası filtrelemeden önce en fazla 1 MB okur; bu nedenle tabloda hâlâ eşleşmeler varken filtrelenmiş bir sayfa boş dönebilir.ddb.scanPaginator(request),LastEvaluatedKeytükenene kadar sayfa istemeye devam eden birScanIterabledöndürür — asla ilk sayfada durmayın. - Sayfa başına (filtreleme öncesi) taranan öğeleri sınırlamak için
.limit(...)ekleyin — döndürülen öğeleri sınırlamaz. - Büyük bir tam tablo taraması için
.segment(...)/.totalSegments(...)(bir paralel tarama) ile işi çalışanlara bölün. Query'yi tercih edin.Scantablonun tamamını okur; çok küçük bir tablo dışında her şeyde yavaş ve pahalıdır.
Görsel olarak yapın
Bir filtreyi elle mi oluşturuyorsunuz? DynamoDB Expression Builder, FilterExpression + ad/değer eşlemelerini oluşturur ve çalıştırılabilir kodu kopyalar.
Bir betikten körlemesine taramak yerine tabloları bir grafik arayüzde (GUI) keşfetmek için — filtrelenmiş, sayfalanmış sonuç ızgaraları ve kod olarak kopyalama — DynoTable'ı indirin.
İlgili örnekler
- Go'da DynamoDB Scan — Go v2 için AWS SDK ile aynı tarama.
- Java'da DynamoDB Query — genellikle başvurmanız gereken daha ucuz okuma.
- Query ve Scan — bir
Scan'in (nadiren) ne zaman haklı olduğu. - DynamoDB Scan'im neden yavaş ve pahalı? — maliyet modeli ve bundan nasıl kaçınılacağı.
- DynamoDB ProvisionedThroughputExceededException — bir tam tablo taramasının, sağlanan bir tablonun kapasitesine ne yaptığı.
- DynamoDB ThrottlingException — diğer kısıtlama ve üstel geri çekilmenin bunu nasıl ele aldığı.
References
- Scan — Amazon DynamoDB API Reference
- Use Scan with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- DynamoDbClient — AWS SDK for Java 2.x API Reference
- ScanRequest — AWS SDK for Java 2.x API Reference
- Scanning tables — Amazon DynamoDB Developer Guide
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.