Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Perubahan dalam APIs pemetaan/dokumen DynamoDB dari versi 1 ke versi 2
Topik ini merinci perubahan tingkat tinggi SDK Java APIs untuk Amazon DynamoDB dari versi 1.x (v1) ke (v2). AWS SDK for Java 2.x Kami pertama-tama membahas object-to-table pemetaan API dan kemudian mendiskusikan dokumen API untuk bekerja dengan dokumen JSON -style.
Perubahan tingkat tinggi
Nama-nama klien pemetaan di setiap pustaka berbeda di v1 dan v2:
-
v1 - D ynamoDBMapper
-
v2 - Klien yang Ditingkatkan DynamoDB
Anda berinteraksi dengan dua pustaka dengan cara yang hampir sama: Anda membuat instance mapper/klien dan kemudian menyediakan Java POJO untuk membaca dan menulis item ini ke tabel APIs DynamoDB. Kedua pustaka juga menawarkan anotasi untuk kelas POJO untuk mengarahkan bagaimana klien menangani. POJO
Perbedaan penting saat Anda pindah ke v2 meliputi:
-
V2 dan v1 menggunakan nama metode yang berbeda untuk operasi DynamoDB tingkat rendah. Sebagai contoh:
v1 v2 muat getItem save putItem batchLoad batchGetItem -
V2 menawarkan beberapa cara untuk menentukan skema tabel dan memetakan POJOs ke tabel. Anda dapat memilih dari penggunaan anotasi atau skema yang dihasilkan dari kode menggunakan pembangun. V2 juga menawarkan versi skema yang dapat berubah dan tidak dapat diubah.
-
Dengan v2, Anda secara khusus membuat skema tabel sebagai salah satu langkah pertama, sedangkan di v1, skema tabel disimpulkan dari kelas beranotasi sesuai kebutuhan.
-
V2 mencakup APIklien Dokumen di klien
yang disempurnakanAPI, sedangkan v1 menggunakan terpisah API. -
Semua APIs tersedia dalam versi sinkron dan asinkron di v2.
Lihat bagian pemetaan DynamoDB dalam panduan ini untuk informasi lebih rinci tentang klien yang disempurnakan v2.
Impor dependensi
v1 | v2 |
---|---|
|
|
Di v1, dependensi tunggal mencakup DynamoDB tingkat rendah dan pemetaan/dokumen, sedangkan di v2, Anda menggunakan ketergantungan API API artefak untuk mengakses pemetaan/dokumen. dynamodb-enhanced
API dynamodb-enhanced
Modul ini berisi ketergantungan transitif pada modul tingkat rendahdynamodb
.
APIperubahan
Buat klien
Kasus penggunaan | v1 | v2 |
---|---|---|
Instantiasi normal |
|
|
Instantiasi minimal |
|
|
Dengan trafo atribut* |
|
|
* Ekstensi di v2 kira-kira sesuai dengan atribut transformer di v1. Gunakan ekstensiBagian ini berisi informasi lebih lanjut tentang ekstensi di v2.
Menetapkan pemetaan ke tabel/indeks DynamoDB
Di v1, Anda menentukan nama tabel DynamoDB melalui anotasi kacang. Dalam v2, metode pabrik,table()
, menghasilkan instance DynamoDbTable
yang mewakili tabel DynamoDB jarak jauh. Parameter pertama dari table()
metode ini adalah nama tabel DynamoDB.
Kasus penggunaan | v1 | v2 |
---|---|---|
Memetakan POJO kelas Java ke tabel DynamoDB |
|
|
Peta ke indeks sekunder DynamoDB |
Bagian dalam DynamoDB Developer Guide yang membahas metode |
Gunakan indeks sekunderBagian dalam panduan ini memberikan informasi lebih lanjut. |
Operasi tabel
Bagian ini menjelaskan operasi APIs yang berbeda antara v1 dan v2 untuk sebagian besar kasus penggunaan standar.
Di v2, semua operasi yang melibatkan satu tabel dipanggil pada DynamoDbTable
instance, bukan pada klien yang disempurnakan. Klien yang disempurnakan berisi metode yang dapat menargetkan beberapa tabel.
Dalam tabel bernama operasi Tabel di bawah ini, sebuah POJO contoh disebut sebagai item
atau sebagai jenis tertentu seperticustomer1
. Untuk contoh v2 instance bernama, table
adalah hasil dari pemanggilan sebelumnya enhancedClient.table()
yang mengembalikan referensi ke DynamoDbTable
instance.
Perhatikan bahwa sebagian besar operasi v2 dapat dipanggil dengan pola konsumen yang lancar bahkan ketika tidak ditampilkan. Misalnya,
Customer customer = table.getItem(r → r.key(key));
or
Customer customer = table.getItem(r → r.key(k -> k.partitionValue("id").sortValue("email")))
Untuk operasi v1, tabel berisi beberapa formulir yang umum digunakan dan tidak semua formulir yang kelebihan beban. Misalnya, load()
metode ini memiliki kelebihan beban berikut:
mapper.load(Customer.class, hashKey)
mapper.load(Customer.class, hashKey, rangeKey)
mapper.load(Customer.class, hashKey, config)
mapper.load(Customer.class, hashKey, rangeKey, config)
mapper.load(item)
mapper.load(item, config)
Tabel menunjukkan bentuk yang umum digunakan:
mapper.load(item) mapper.load(item, config)
Kasus penggunaan | v1 | Operasi DynamoDB | v2 |
---|---|---|---|
Menulis Java POJO ke tabel DynamoDB |
Dalam v1, |
PutItem , UpdateItem |
|
Membaca item dari tabel DynamoDB ke Java POJO |
|
GetItem |
|
Menghapus item dari tabel DynamoDB |
|
DeleteItem |
|
Kueri tabel DynamoDB atau indeks sekunder dan kembalikan daftar paginasi |
|
Query |
Gunakan yang dikembalikan |
Kueri tabel DynamoDB atau indeks sekunder dan kembalikan daftar |
|
Query |
Gunakan yang dikembalikan |
Memindai tabel DynamoDB atau indeks sekunder dan mengembalikan daftar paginasi |
|
Scan |
Gunakan yang dikembalikan |
Pindai tabel DynamoDB atau indeks sekunder dan kembalikan daftar |
|
Scan |
Gunakan yang dikembalikan |
Baca beberapa item dari beberapa tabel dalam satu batch |
|
BatchGetItem |
|
Tulis beberapa item ke beberapa tabel dalam satu batch |
|
BatchWriteItem |
|
Hapus beberapa item dari beberapa tabel dalam satu batch |
|
BatchWriteItem |
|
Tulis/hapus beberapa item dalam satu batch |
|
BatchWriteItem |
|
Lakukan penulisan transaksional |
|
TransactWriteItems |
|
Lakukan pembacaan transaksional |
|
TransactGetItems |
|
Dapatkan hitungan item yang cocok dari pemindaian atau kueri |
|
Query , Scan dengan Select.COUNT |
Tidak didukung |
Buat tabel di DynamoDB sesuai dengan kelas POJO |
Pernyataan sebelumnya menghasilkan permintaan tabel buat tingkat rendah; pengguna harus memanggil klien |
CreateTable |
|
Lakukan pemindaian paralel di DynamoDB |
|
Scan dengan Segment dan TotalSegments parameter |
Pengguna diminta untuk menangani thread pekerja dan memanggil
|
Integrasikan Amazon S3 dengan DynamoDB untuk menyimpan tautan S3 cerdas |
|
- |
Tidak didukung karena memasangkan Amazon S3 dan DynamoDB. |
Kelas peta dan properti
Di v1 dan v2, Anda memetakan kelas ke tabel menggunakan anotasi gaya kacang. V2 juga menawarkan cara lain untuk mendefinisikan skema untuk kasus penggunaan tertentu, seperti bekerja dengan kelas yang tidak dapat diubah.
Anotasi kacang
Tabel berikut menunjukkan anotasi kacang setara untuk kasus penggunaan tertentu yang digunakan dalam v1 dan v2. Skenario Customer
kelas digunakan untuk menggambarkan parameter.
Anotasi — serta kelas dan pencacahan — di v2 ikuti konvensi kasus unta dan gunakan '', bukan 'DynamoDB'. DynamoDb
Kasus penggunaan | v1 | v2 |
---|---|---|
Petakan kelas ke tabel |
|
Nama tabel didefinisikan saat memanggil DynamoDbEDnhancedClient#table() metode. |
Menunjuk anggota kelas sebagai atribut tabel |
|
|
Menunjuk anggota kelas adalah kunci hash/partisi |
|
|
Menunjuk anggota kelas adalah kunci rentang/sortir |
|
|
Menunjuk anggota kelas adalah kunci hash/partisi indeks sekunder |
|
|
Menunjuk anggota kelas adalah kunci rentang/sortir indeks sekunder |
|
|
Abaikan anggota kelas ini saat memetakan ke tabel |
|
|
Tentukan anggota kelas sebagai atribut kunci yang dibuat secara otomatis UUID |
|
Ekstensi yang menyediakan ini tidak dimuat secara default; Anda harus menambahkan ekstensi ke pembuat klien. |
Tentukan anggota kelas sebagai atribut timestamp yang dibuat secara otomatis |
|
Ekstensi yang menyediakan ini tidak dimuat secara default; Anda harus menambahkan ekstensi ke pembuat klien. |
Menunjuk anggota kelas sebagai atribut versi auto-incremented |
|
Ekstensi yang menyediakan ini dimuat secara otomatis. |
Menunjuk anggota kelas sebagai membutuhkan konversi kustom |
|
|
Menunjuk anggota kelas untuk disimpan sebagai jenis atribut yang berbeda |
|
Tanpa padanan |
Tentukan kelas yang dapat diserialisasikan ke dokumen DynamoDB (-style document) atau sub-dokumen JSON |
|
Tidak ada anotasi setara langsung. Gunakan dokumen yang disempurnakanAPI. |
V2 anotasi tambahan
Kasus penggunaan | v1 | v2 |
---|---|---|
Menunjuk anggota kelas untuk tidak disimpan sebagai NULL atribut jika nilai Java adalah null | N/A |
|
Menunjuk anggota kelas untuk menjadi objek kosong jika semua atribut adalah null | N/A |
|
Tentukan tindakan pembaruan khusus untuk anggota kelas | N/A |
|
Tentukan kelas yang tidak dapat diubah | N/A |
|
Menunjuk anggota kelas sebagai atribut counter auto-incremented | N/A |
Ekstensi yang menyediakan fungsi ini dimuat secara otomatis. |
Konfigurasi
Di v1, Anda biasanya mengontrol perilaku tertentu dengan menggunakan instance. DynamoDBMapperConfig
Anda dapat menyediakan objek konfigurasi baik ketika Anda membuat mapper atau ketika Anda membuat permintaan. Di v2, konfigurasi khusus untuk objek permintaan untuk operasi.
Kasus penggunaan | v1 | Default di v1 | v2 |
---|---|---|---|
|
|||
Strategi coba lagi pemuatan batch |
|
coba lagi item yang gagal | |
Batch menulis strategi coba lagi |
|
coba lagi item yang gagal | |
Bacaan yang konsisten |
|
EVENTUAL |
Secara default, pembacaan konsisten salah untuk operasi baca. Ganti dengan .consistentRead(true) objek permintaan. |
Skema konversi dengan set marshallers/unmarshallers |
Implementasi statis memberikan kompatibilitas mundur dengan versi yang lebih lama. |
V2_COMPATIBLE |
Tidak berlaku. Ini adalah fitur lama yang mengacu pada bagaimana versi awal DynamoDB (v1) menyimpan tipe data, dan perilaku ini tidak akan dipertahankan di klien yang disempurnakan. Contoh perilaku di DynamoDB v1 adalah menyimpan boolean sebagai Number, bukan sebagai Boolean. |
Nama tabel |
Implementasi statis memberikan kompatibilitas mundur dengan versi yang lebih lama |
gunakan anotasi atau tebakan dari kelas |
Nama tabel didefinisikan saat memanggil |
Strategi beban pagination |
Pilihannya adalah: LAZY _ |
LAZY_LOADING |
Iterasi saja adalah default. Opsi v1 lainnya tidak didukung. |
Minta pengumpulan metrik |
|
null |
Gunakan metricPublisher() ClientOverrideConfiguration saat membangun klien DynamoDB standar. |
Simpan perilaku |
Pilihannya adalah |
UPDATE |
Di v2, Anda menelepon
|
Jenis konverter pabrik |
|
konverter tipe standar |
Atur kacang dengan menggunakan
|
Konfigurasi per operasi
Di v1, beberapa operasi, sepertiquery()
, sangat dapat dikonfigurasi melalui objek “ekspresi” yang dikirimkan ke operasi. Sebagai contoh:
DynamoDBQueryExpression<Customer> emailBwQueryExpr = new DynamoDBQueryExpression<Customer>() .withRangeKeyCondition("Email", new Condition() .withComparisonOperator(ComparisonOperator.BEGINS_WITH) .withAttributeValueList( new AttributeValue().withS("my"))); mapper.query(Customer.class, emailBwQueryExpr);
Di v2, alih-alih menggunakan objek konfigurasi, Anda menetapkan parameter pada objek permintaan dengan menggunakan pembuat. Sebagai contoh:
QueryEnhancedRequest emailBw = QueryEnhancedRequest.builder() .queryConditional(QueryConditional .sortBeginsWith(kb -> kb .sortValue("my"))).build(); customerTable.query(emailBw);
Kondisional
Dalam v2, ekspresi kondisional dan penyaringan diekspresikan menggunakan Expression
objek, yang merangkum kondisi dan pemetaan nama dan filter.
Kasus penggunaan | Operasi | v1 | v2 |
---|---|---|---|
Kondisi atribut yang diharapkan | save (), delete (), query (), scan () |
|
Usang; gunakan sebagai gantinya. ConditionExpression |
Ekspresi kondisi | hapus () |
|
|
Ekspresi filter | query (), scan () |
|
|
Ekspresi kondisi untuk kueri | kueri () |
|
|
Jenis konversi
Konverter default
Di v2, SDK menyediakan satu set konverter default untuk semua jenis umum. Anda dapat mengubah konverter tipe baik di tingkat penyedia keseluruhan maupun untuk satu atribut. Anda dapat menemukan daftar konverter yang tersedia di AttributeConverter
Menetapkan konverter kustom untuk atribut
Di v1, Anda dapat membuat anotasi metode pengambil dengan @DynamoDBTypeConverted
untuk menentukan kelas yang mengkonversi antara tipe atribut Java dan tipe atribut DynamoDB. Misalnya, CurrencyFormatConverter
yang mengkonversi antara Currency
tipe Java dan DynamoDB String dapat diterapkan seperti yang ditunjukkan pada cuplikan berikut.
@DynamoDBTypeConverted(converter = CurrencyFormatConverter.class)
public Currency getCurrency() { return currency; }
Setara v2 dari cuplikan sebelumnya ditunjukkan di bawah ini.
@DynamoDbConvertedBy(CurrencyFormatConverter.class)
public Currency getCurrency() { return currency; }
catatan
Di v1, Anda dapat menerapkan anotasi ke atribut itu sendiri, tipe atau anotasi yang ditentukan pengguna, v2 mendukung penerapan anotasi hanya ke pengambil.
Tambahkan pabrik atau penyedia konverter tipe
Di v1, Anda dapat menyediakan set konverter tipe Anda sendiri, atau mengganti tipe yang Anda pedulikan dengan menambahkan pabrik konverter tipe ke konfigurasi. Pabrik konverter tipe meluasDynamoDBTypeConverterFactory
, dan penggantian dilakukan dengan mendapatkan referensi ke set default dan memperluasnya. Cuplikan berikut menunjukkan cara melakukan ini.
DynamoDBTypeConverterFactory typeConverterFactory =
DynamoDBTypeConverterFactory.standard().override()
.with(String.class, CustomBoolean.class, new DynamoDBTypeConverter<String, CustomBoolean>() {
@Override
public String convert(CustomBoolean bool) {
return String.valueOf(bool.getValue());
}
@Override
public CustomBoolean unconvert(String string) {
return new CustomBoolean(Boolean.valueOf(string));
}}).build();
DynamoDBMapperConfig config =
DynamoDBMapperConfig.builder()
.withTypeConverterFactory(typeConverterFactory)
.build();
DynamoDBMapper mapperWithTypeConverterFactory = new DynamoDBMapper(dynamo, config);
V2 menyediakan fungsionalitas serupa melalui @DynamoDbBean
anotasi. Anda dapat memberikan satu AttributeConverterProvider
atau satu rantai pesananAttributeConverterProvider
. Perhatikan bahwa jika Anda menyediakan rantai penyedia konverter atribut Anda sendiri, Anda akan mengganti penyedia konverter default dan harus memasukkannya ke dalam rantai untuk menggunakan konverter atributnya.
@DynamoDbBean(converterProviders = {
ConverterProvider1.class,
ConverterProvider2.class,
DefaultAttributeConverterProvider.class})
public class Customer {
...
}
Bagian tentang konversi atribut dalam panduan ini berisi contoh lengkap untuk v2.
Riwayat dokumen
Dokumen API mendukung bekerja dengan dokumen JSON -style sebagai item tunggal dalam tabel DynamoDB. Dokumen v1 API memiliki yang sesuai API di v2, tetapi alih-alih menggunakan klien terpisah untuk dokumen API seperti pada v1, v2 menggabungkan API fitur dokumen dalam klien yang ditingkatkan DynamoDB.
Di v1, Item
kelas mewakili catatan tidak terstruktur dari tabel DynamoDB. Dalam v2, catatan tidak terstruktur diwakili oleh instance EnhancedDocument
Tabel di bawah ini membandingkan perbedaan antara Dokumen APIs di v1 dan v2.
Kasus penggunaan | v1 | v2 |
---|---|---|
Buat klien dokumen |
|
|
Referensi tabel |
|
|
Work with semi-structured data | ||
Put item |
|
|
Get item |
|
|
Work with JSON items | ||
Mengkonversi JSON struktur untuk menggunakannya dengan Dokumen API |
|
|
Masukan JSON |
|
|
Baca JSON |
|
|
APIreferensi dan panduan untuk dokumen APIs
v1 | v2 | |
---|---|---|
Referensi API | Javadoc | Javadoc |
Panduan dokumentasi | Panduan Pengembang Amazon DynamoDB | Dokumen yang Ditingkatkan API (panduan ini) |
FAQ
T. Apakah penguncian optimis dengan nomor versi bekerja dengan cara yang sama di v2 seperti di v1?
A. Perilakunya serupa, tetapi v2 tidak secara otomatis menambahkan kondisi untuk operasi penghapusan. Anda harus menambahkan ekspresi kondisi secara manual jika Anda ingin mengontrol perilaku hapus.