Alıştırma - NoSQL verilerini program aracılığıyla oluşturma, okuma, güncelleştirme ve silme

Tamamlandı

Azure Cosmos DB ile bağlantı kurdunuz. Bu ünitede, WebCustomers koleksiyonunuzda birkaç kullanıcı belgesi oluşturacaksınız. Ardından belgeleri kimliğe göre alacak, değiştirecek ve sileceksiniz.

Belgelerle programlı olarak çalışma

Azure Cosmos DB'de veriler JSON belgelerinde depolanır. Belgeler portaldan veya program aracılığıyla oluşturulabilir, alınabilir, değiştirilebilir veya silinebilir. Bu laboratuvar, programlama işlemlerine odaklanır. Azure Cosmos DB .NET, .NET Core, Java, Node.js ve Python için istemci tarafı SDK’ları sağlar ve bunlardan her biri bu işlemleri destekler. Bu modülde, Azure Cosmos DB’de depolanan NoSQL verileri üzerinde CRUD (oluşturma, alma, güncelleştirme ve silme) işlemlerini gerçekleştirmek için Java SDK’sı kullanacağız.

Azure Cosmos DB belgelerinin ana işlemleri CosmosAsyncContainer sınıfının parçasıdır:

Upsert, belgenin önceden var olup olmamasına bağlı olarak bir oluşturma veya değiştirme işlemi gerçekleştirir.

Bu işlemlerden herhangi birini gerçekleştirmek için veritabanında depolanan nesneleri temsil eden yardımcı sınıflara (Java POJO sınıfları) ihtiyacınız olacak. Kullanıcıların bulunduğu veritabanı üzerinde çalıştığımız için kullanıcı varlıklarını temsil eden bir User sınıfı oluşturacağız. Bu sınıf kullanıcıların adı, soyadı ve kullanıcı kimliği gibi birincil verileri depolamak için kullanılacak. (Kimlik, yatay ölçeklendirme gerçekleştirmek için bölüm anahtarı olarak kullanıldığından gereklidir.)

Her kullanıcıyla ilişkilendirilmiş gönderim tercihleri ve kuponlar olduğundan bu varlıkları temsil eden ShippingPreference ve CouponsUsed veri türlerine de ihtiyacınız olacak. Son olarak her kullanıcının potansiyel olarak sınırsız sayıda sipariş içeren bir sipariş geçmişi kaydı olabilir. Bu nedenle bir Java POJO sınıfına sahip ayrı OrderHistory varlıkları oluşturacağız.

src/main/java/com/azure/azure-cosmos-java-sql-app-mslearn dizinine gidin ve datatypes klasörünü inceleyin. Birkaç POJO göreceksiniz: User, ShippingPreference, OrderHistory ve CouponsUsed. Gerekli tüm varlık POJOs'larını ve yardımcı sınıflarını sağladık!

Sonraki adımda birkaç varlık oluşturup Azure Cosmos DB kapsayıcısında ve içindeki belgelerde birkaç basit CRUD işlemi gerçekleştireceğiz. Azure Cosmos DB'ye doğrudan JSON belgesini belirten bir Jackson ObjectNode örneği iletebilirsiniz. Ancak Azure Cosmos DB ayrıca Java POJO'larını seri hale getirerek JSON'a dönüştürebilir. Diğerleriyle aynı işlevi yerine getirse de en basit seçenek bu olduğundan bu yaklaşımı kullanmanız önerilir.

Belgeleri oluşturma

  1. User.java dosyasını açıp içeriğini inceleyin. Şuna benzer şekilde görünecektir:

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.util.List;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class User {
    
        /** Document ID (required by Azure Cosmos DB). */
        private String id;
    
        /** User ID. */
        private String userId;
    
        /** User last name. */
        private String lastName;
    
        /** User first name. */
        private String firstName;
    
        /** User email address. */
        private String email;
    
        /** User dividend setting. */
        private String dividend;
    
        /** User shipping preferences. */
        private ShippingPreference shippingPreference;
    
        /** User order history. */
        private List<OrderHistory> orderHistory;
    
        /** Coupons recorded by the user. */
        private List<CouponsUsed> coupons;
    }
    

    id, userId ve diğer alanların erişim mekanizmalarının örtük olduğuna (kod içinde tanımlanmadığına) dikkat edin. Bu davranışı mümkün kılan şey, bunları otomatik olarak oluşturmak için Project Lombok @Data ek açıklamasını kullanmamızdır.

    @NoArgsConstructor ek açıklaması varsayılan alan değerlerini ayarlayan ve bağımsız değişken içermeyen bir yapı oluşturur. @AllArgsConstructor ek açıklaması da tüm alan değerlerini doğrudan belirtmek için tam bağımsız değişken kümesine sahip olan başka bir yapı oluşturur.

    User öğesinin id özelliğine sahip olduğuna dikkat edin. Tüm Azure Cosmos DB belgelerinde id özelliği bulunması gerekir. Bu nedenle JSON belgesi olarak seri hale getirmek istediğimiz tüm POJO'larda da id alanı bulunması şarttır.

  2. Aşağıdaki yöntemi CosmosApp.java dosyasına ekleyin:

    /**
     * Take in list of Java POJOs, check if each exists, and if not insert it.
     * @param users List of User POJOs to insert.
     */
    private static void createUserDocumentsIfNotExist(final List<User> users) {
        Flux.fromIterable(users).flatMap(user -> {
            try {
                container.readItem(user.getId(), new PartitionKey(user.getUserId()), User.class).block();
                logger.info("User {} already exists in the database", user.getId());
                return Mono.empty();
            } catch (Exception err) {
                logger.info("Creating User {}", user.getId());
                return container.createItem(user, new PartitionKey(user.getUserId()), new CosmosItemRequestOptions());
            }
        }).blockLast();
    }
    
  3. Ardından basicOperations yöntemine dönün ve aşağıdakini bu yöntemin sonuna, client.close() çağrısının önüne ekleyin.

    User maxaxam = new User(
        "1",
        "maxaxam",
        "Axam",
        "Max",
        "maxaxam@contoso.com",
        "2.0",
        new ShippingPreference(
            1,
            "90 W 8th St",
            "",
            "New York",
            "NY",
            "10001",
            "USA"
        ),
        new ArrayList<OrderHistory>(Arrays.asList(
            new OrderHistory(
                "3",
                "1000",
                "08/17/2018",
                "52.49"
            )
        )),
        new ArrayList<CouponsUsed>(Arrays.asList(
            new CouponsUsed(
                "A7B89F"
            )
        ))
    );
    
    User nelapin = new User(
            "2",
            "nelapin",
            "Pindakova",
            "Nela",
            "nelapin@contoso.com",
            "8.50",
            new ShippingPreference(
                1,
                "505 NW 5th St",
                "",
                "New York",
                "NY",
                "10001",
                "USA"
            ),
            new ArrayList<OrderHistory>(Arrays.asList(
                new OrderHistory(
                    "4",
                    "1001",
                    "08/17/2018",
                    "105.89"
                )
            )),
            new ArrayList<CouponsUsed>(Arrays.asList(
                new CouponsUsed(
                    "Fall 2018"
                )
            ))
    );
    
    createUserDocumentsIfNotExist(new ArrayList<User>(Arrays.asList(maxaxam, nelapin)));
    
  4. CosmosApp.java uygulamasını IDE'de derleyip çalıştırın veya şu komutu kullanarak programı terminalde çalıştırın:

    mvn clean package
    mvn exec:java -Dexec.mainClass="com.azure.cosmos.examples.mslearnbasicapp.CosmosApp"
    

    Uygulama yeni kullanıcı belgesi oluşturdukça terminalde çıkış görüntülenir.

    INFO: Database and container validation complete
    INFO: Creating User 1
    INFO: Creating User 2
    

    Günlükçünün zaman damgası gibi ek metinler gönderdiğini de görebilirsiniz.

Tebrikler! Java uygulamasını kullanarak Azure Cosmos DB'de veri oluşturmayı başardınız. Şimdi biraz durup yaptıklarımızı değerlendirelim.

basicOperations içinde üç yeni eylem var:

  1. maxaxamUser örneğini oluşturun.
  2. NelapinUser örneğini oluşturun.
  3. createUserDocumentsIfNotExist çağrısı yapma ve maxaxam ile nelapin örneklerini liste olarak geçirme.

createUserDocumentsIfNotExist çağrısı iki User örneğini de Azure Cosmos DB'ya öğe/belge olarak ekler. User örneklerini liste olarak geçirmemizin amacı, POJO'ları minimum işlem kaynağı kullanarak ve hızlı bir şekilde Azure Cosmos DB'ye almak için yüksek performanslı bir yöntem modellemekti. createUserDocumentsIfNotExist, POJO listesindeki öğelerin verimli ve zaman uyumsuz bir şekilde eklenmesini sağlar.

İş parçacığı başına istek/saniye miktarını en üst düzeye çıkarmayı hedeflediğimizi düşünelim. Karşılaştıracak olursak createUserDocumentsIfNotExist yazmaya yönelik eşitleme yaklaşımı aşağıda gösterildiği gibi (bu seferlik readItem denetimini yoksayarsak) users içindeki her bir User için yinele olacaktır. Her Useruiçin öğesine engelleyici bir çağrı createItemyaparız:

container.createItem(u, new PartitionKey(u.getUserId()), new CosmosItemRequestOptions()).block(); // <= Note the .block() which loops until request response.

Bu eşitleme stili sezgisel bir süreç uygular: isteği gönder, yanıt bekle, bir sonraki isteği gönder. Ancak engelleme çağrıları istek yanıt süresi sırasında CPU döngülerini boşa harcayarak istek/saniye değerinin düşmesine neden olduğundan createUserDocumentsIfNotExist bu yaklaşımı kullanmaz.

Bu istek/saniye sorununun üstesinden gelmek için birden çok iş parçacığı üretebilir ve engelleme isteği çağrılarını paralel yürütebilirsiniz. Birden çok iş parçacığı, yürütme süresini iyileştirir. Ancak hedefiniz iş parçacığı kaynaklarını verimli bir şekilde kullanmaksa bu yaklaşım da işinizi görmeyecektir. Her iş parçacığı çok görevli çalışarak başka bir işle meşgul olmak yerine istek yanıt süresi sırasında döngü halinde çalıştırılır ve iş parçacığı başına istek/saniye değeri düşer.

Bu nedenle ve Java POJO'larının iş parçacıklarının verimli şekilde kullanılarak eklenmesini gösterme amacıyla belge ekleme sürecinin zaman uyumsuz bir örneğini sağladık. Azure Cosmos DB Java SDK v4 zaman uyumsuz işlem desteği, zaman uyumsuz olay temelli programlama için akış tabanlı, bildirim temelli programlama modeli sunan bir Java uygulama çerçevesi olan Project Reactor tarafından sağlanır. createDocumentsIfNotExist, Project Reactor ile zaman uyumsuz programlama gerçekleştirir.

createUserDocumentsIfNotExist içinde Flux.fromIterable(users) bir Project Reactor fabrika yöntemidir. Bu yöntem zaman uyumsuz olayların kaynağı olan bir Flux örneği oluşturur. Bu durumda her bir zaman uyumsuz "olay" bir User örneği bağımsız değişkeni içerir. Flux örneği biri maxaxam, biri de nelapin için olmak üzere aynı türde iki olay içerir. .flatMap( ... ).blockLast(); içindeki kod, Flux örneği tarafından gönderilen olaylar üzerinde gerçekleştirilecek sıralı işlemlerin bulunduğu işlem hattını tanımlar.

createItem bu işlemlerden biridir. Buradaki fikir, bu işlem hattının createItem çağrısının engellenmesi dışında zaman uyumlu uygulamaya benzer olduğudur. Özellikle, çağrısı blockLast()birleştirilmiş işlem hattına abone olur ve öğesinin zaman uyumsuz olarak iki olayını yaymasına neden olurFlux. Ardından .flatMap( ... ).blockLast(); içindeki işlem hattı ise bu olayların her birini paralel şekilde işler. Bir istek gönderildiğinde ve yanıt beklediğinde Project Reactor arka planda diğer istekleri işler ve bu da iş parçacığı başına istek/saniye değerini en üst düzeye çıkarma açısından kritik öneme sahiptir.

Project Reactor ile verimli zaman uyumsuz veritabanı isteklerini gördünüz. Kolaylık olması açısından bu laboratuvarın geri kalan kısmında engelleme (zaman uyumlu) çağrılarını kullanacağız. Project Reactor hakkında daha fazla bilgi edinmek için Azure Cosmos DB Reactor Desen Kılavuzu'na bakın.

Belgeleri okuma

  1. Veritabanındaki belgeleri okumak için CosmosApp içine şu yöntemi ekleyin:

    /**
     * Take in a Java POJO argument, extract ID and partition key, and read the corresponding document from the container.
     * In this case the ID is the partition key.
     * @param user User POJO to pull ID and partition key from.
     */
    private static CosmosItemResponse<User> readUserDocument(final User user) {
        CosmosItemResponse<User> userReadResponse = null;
    
        try {
            userReadResponse = container.readItem(user.getId(), new PartitionKey(user.getUserId()), User.class).block();
            logger.info("Read user {}", user.getId());
        } catch (CosmosException de) {
            logger.error("Failed to read user {}", user.getId(), de);
        }
    
        return userReadResponse;
    }
    
  2. Aşağıdaki kodu kopyalayın ve basicOperations yönteminin sonuna, belge oluşturma kodunun altına yapıştırın:

    readUserDocument(maxaxam);
    
  3. CosmosApp.java uygulamasını IDE'de derleyip çalıştırın veya şu komutu kullanarak programı terminalde çalıştırın:

    mvn clean package
    mvn exec:java -Dexec.mainClass="com.azure.cosmos.examples.mslearnbasicapp.CosmosApp"
    

    Terminalde aşağıdaki çıkış görüntülenir; burada "Read user 1" ifadesi belgenin alındığını gösterir.

    INFO: Database and container validation complete
    INFO: User 1 already exists in the database
    INFO: User 2 already exists in the database
    INFO: Read user 1
    

    Günlükçü tarafından gönderilen ek metinler de görebilirsiniz.

Belgeleri değiştirme

Azure Cosmos DB, JSON belgelerini değiştirmeyi destekler. Bu örnekte, soyadındaki değişikliği yansıtacak şekilde kullanıcı kaydını güncelleştireceğiz.

  1. replaceUserDocument yöntemini CosmosApp.java dosyasına, readUserDocument yönteminin altına ekleyin.

    /**
     * Take in a Java POJO argument, extract ID and partition key,
     * and replace the existing document with the same ID and partition key to match.
     * @param user User POJO representing the document update.
     */
    private static void replaceUserDocument(final User user) {
        try {
            CosmosItemResponse<User> userReplaceResponse = container.replaceItem(user, user.getId(), new PartitionKey(user.getUserId())).block();
            logger.info("Replaced User {}", user.getId());
        } catch (CosmosException de) {
            logger.error("Failed to replace User {}", user.getUserId());
        }
    }
    
  2. Aşağıdaki kodu kopyalayıp yöntemin basicOperations sonuna, belge kodu okunduktan sonra yapıştırın.

    maxaxam.setLastName("Suh");
    replaceUserDocument(maxaxam);
    
  3. CosmosApp.java uygulamasını IDE'de derleyip çalıştırın veya şu komutu kullanarak programı terminalde çalıştırın:

    mvn clean package
    mvn exec:java -Dexec.mainClass="com.azure.cosmos.examples.mslearnbasicapp.CosmosApp"
    

    Terminalde aşağıdaki çıkış görüntülenir; burada "Replaced last name for Suh" ifadesi belgenin değiştirildiğini gösterir.

    INFO: Database and container validation complete
    INFO: User 1 already exists in the database
    INFO: User 2 already exists in the database
    INFO: Read user 1
    INFO: Replaced last name for Suh
    

Belgeleri silme

  1. deleteUserDocument yöntemini kopyalayıp replaceUserDocument yönteminin altına yapıştırın.

    /**
     * Take in a Java POJO argument, extract ID and partition key,
     * and delete the corresponding document.
     * @param user User POJO representing the document update.
     */
    private static void deleteUserDocument(final User user) {
        try {
            container.deleteItem(user.getId(), new PartitionKey(user.getUserId())).block();
            logger.info("Deleted user {}", user.getId());
        } catch (CosmosException de) {
            logger.error("User {} could not be deleted.", user.getId());
        }
    }
    
  2. Aşağıdaki kodu kopyalayın ve basicOperations yönteminin sonuna yapıştırın.

    deleteUserDocument(maxaxam);
    
  3. CosmosApp.java uygulamasını IDE'de derleyip çalıştırın veya şu komutu kullanarak programı terminalde çalıştırın:

    mvn clean package
    mvn exec:java -Dexec.mainClass="com.azure.cosmos.examples.mslearnbasicapp.CosmosApp"
    

    Terminalde aşağıdaki çıkış görüntülenir; burada "Deleted user 1" ifadesi belgenin silindiğini gösterir.

    INFO: Database and container validation complete
    INFO: User 1 already exists in the database
    INFO: User 2 already exists in the database
    INFO: Read User 1
    INFO: Replaced last name for Suh
    INFO: Deleted User 1
    

Belgelerle programlı olarak çalışma

Azure Cosmos DB'de veriler JSON belgelerinde depolanır. Belgeler portaldan veya program aracılığıyla oluşturulabilir, alınabilir, değiştirilebilir veya silinebilir. Bu laboratuvar, programlama işlemlerine odaklanır. Bu işlemlerin tümü Azure Cosmos DB Java SDK'sında kullanılabilir ve Spring Data programlama modeli aracılığıyla da erişilebilir. Bu modülde, Azure Cosmos DB’de depolanan NoSQL verileri üzerinde CRUD (oluşturma, alma, güncelleştirme ve silme) işlemlerini gerçekleştirmek için Spring Data Azure Cosmos DB kullanacağız.

Spring Data Azure Cosmos DB belgelerinin ana işlemleri, Spring Data programlama modelindeki temel işlemlerdir:

  • save - belgenin zaten mevcut olup olmadığına bağlı olarak, belgeyi noktadan yazma veya güncelleştirme.
  • view - belgeyi noktadan okuma
  • delete - belgeyi noktadan silme

Bu işlemlerden herhangi birini gerçekleştirmek için veritabanında depolanan nesneleri temsil eden yardımcı sınıflara (Java POJO sınıfları) ihtiyacınız olacak. Çevrimiçi müşterilerin bulunduğu bir veritabanı üzerinde çalıştığımız için kullanıcı varlıklarını temsil etmek için bir WebCustomer sınıfı kullanırsınız. Bu sınıf kullanıcıların adı, soyadı ve kullanıcı kimliği gibi birincil verileri depolamak için kullanılacak. (Kimlik, yatay ölçeklendirme gerçekleştirmek için bölüm anahtarı olarak kullanıldığından gereklidir.)

Her web müşterisiyle ilişkilendirilmiş gönderim tercihleri ve kuponlar olduğundan bu varlıkları temsil eden ShippingPreference ve CouponsUsed veri türlerine de ihtiyacınız olacak. Son olarak her web müşterisinin potansiyel olarak sınırsız sayıda sipariş içeren bir sipariş geçmişi kaydı olabilir. Bu nedenle bir Java POJO sınıfına sahip ayrı OrderHistory varlıkları oluşturacağız.

src/main/java/com/azure/cosmos/examples/springexamples öğesine gidin. WebCustomer POJO’yu görürsünüz. Şimdi ortak klasöre bakın. Birkaç POJO göreceksiniz: ShippingPreference, OrderHistory ve CouponsUsed. Gerekli tüm varlık POJOs'larını ve yardımcı sınıflarını sağladık!

Sonraki adımda birkaç varlık oluşturup Azure Cosmos DB kapsayıcısında ve içindeki belgelerde birkaç basit CRUD işlemi gerçekleştireceğiz. Azure Cosmos DB'ye doğrudan JSON belgesini belirten bir Jackson ObjectNode örneği iletebilirsiniz. Ancak Azure Cosmos DB ayrıca Java POJO'larını seri hale getirerek JSON'a dönüştürebilir. Diğerleriyle aynı işlevi yerine getirse de en basit seçenek bu olduğundan bu yaklaşımı kullanmanız önerilir.

Belgeleri oluşturma ve güncelleştirme

  1. WebCustomer.java dosyasını açıp içeriğini inceleyin. Şuna benzer şekilde görünecektir:

    // Copyright (c) Microsoft Corporation. All rights reserved.
    // Licensed under the MIT License.
    package com.azure.cosmos.examples.springexamples;
    
    import com.azure.cosmos.examples.springexamples.common.CouponsUsed;
    import com.azure.cosmos.examples.springexamples.common.OrderHistory;
    import com.azure.cosmos.examples.springexamples.common.ShippingPreference;
    import com.azure.spring.data.cosmos.core.mapping.Container;
    import com.azure.spring.data.cosmos.core.mapping.PartitionKey;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.util.List;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Container(containerName = "WebCustomer", ru = "400")
    public class WebCustomer {
    
        /** Document ID (required by Azure Cosmos DB). */
        private String id;
    
        /** WebCustomer ID. */
        private String userId;
    
        /** WebCustomer last name. */
        @PartitionKey
        private String lastName;
    
        /** WebCustomer first name. */
        private String firstName;
    
        /** WebCustomer email address. */
        private String email;
    
        /** WebCustomer dividend setting. */
        private String dividend;
    
        /** WebCustomer shipping preferences. */
        private ShippingPreference shippingPreference;
    
        /** WebCustomer order history. */
        private List<OrderHistory> orderHistory;
    
        /** Coupons recorded by the user. */
        private List<CouponsUsed> coupons;
    }
    

    id, userId ve diğer alanların erişim mekanizmalarının örtük olduğuna (kod içinde tanımlanmadığına) dikkat edin. Bu davranışı mümkün kılan şey, bunları otomatik olarak oluşturmak için Project Lombok @Data ek açıklamasını kullanmamızdır.

    @NoArgsConstructor ek açıklaması varsayılan alan değerlerini ayarlayan ve bağımsız değişken içermeyen bir yapı oluşturur. @AllArgsConstructor ek açıklaması da tüm alan değerlerini doğrudan belirtmek için tam bağımsız değişken kümesine sahip olan başka bir yapı oluşturur.

    WebCustomer öğesinin id özelliğine sahip olduğuna dikkat edin. Tüm Azure Cosmos DB belgelerinde id özelliği bulunması gerekir. Bu nedenle JSON belgesi olarak seri hale getirmek istediğimiz tüm POJO'larda da id alanı bulunması şarttır.

  2. Aşağıdaki yöntemi CosmosSample.java dosyasına ekleyin:

    /**
     * Take in list of Java POJOs and insert them into the database.
     * @param webCustomers List of WebCustomer POJOs to insert.
     */
    private void createWebCustomerDocumentsIfNotExist(final List<WebCustomer> webCustomers) {
        Flux.fromIterable(webCustomers).flatMap(webCustomer -> {
            logger.info("Creating WebCustomer {}", webCustomer.getId());
            return this.reactiveWebCustomerRepository.save(webCustomer);
        }).blockLast();
    }
    
  3. run yöntemini bulun ve aşağıdaki kodu bu yöntemin sonuna ekleyin.

    WebCustomer maxaxam = new WebCustomer(
            "1",
            "maxaxam",
            "Axam",
            "Max",
            "maxaxam@contoso.com",
            "2.0",
            new ShippingPreference(
                    1,
                    "90 W 8th St",
                    "",
                    "New York",
                    "NY",
                    "10001",
                    "USA"
            ),
            new ArrayList<OrderHistory>(Arrays.asList(
                    new OrderHistory(
                            "3",
                            "1000",
                            "08/17/2018",
                            "52.49"
                    )
            )),
            new ArrayList<CouponsUsed>(Arrays.asList(
                    new CouponsUsed(
                            "A7B89F"
                    )
            ))
    );
    
    WebCustomer nelapin = new WebCustomer(
            "2",
            "nelapin",
            "Pindakova",
            "Nela",
            "nelapin@contoso.com",
            "8.50",
            new ShippingPreference(
                    1,
                    "505 NW 5th St",
                    "",
                    "New York",
                    "NY",
                    "10001",
                    "USA"
            ),
            new ArrayList<OrderHistory>(Arrays.asList(
                    new OrderHistory(
                            "4",
                            "1001",
                            "08/17/2018",
                            "105.89"
                    )
            )),
            new ArrayList<CouponsUsed>(Arrays.asList(
                    new CouponsUsed(
                            "Fall 2018"
                    )
            ))
    );
    
    createWebCustomerDocumentsIfNotExist(new ArrayList(Arrays.asList(maxaxam, nelapin)));
    
  4. CosmosSample.java uygulamasını IDE'de derleyip çalıştırın veya şu komutu kullanarak programı terminalde çalıştırın:

    mvn clean package
    mvn spring-boot:run
    

    Terminal çıkışında aşağıdakini görmeniz gerekir

    INFO: Creating WebCustomer 1
    INFO: Creating WebCustomer 2
    

Tebrikler! Java uygulamasını kullanarak Azure Cosmos DB'de veri oluşturdunuz ve/veya güncelleştirdiniz. Şimdi biraz durup yaptıklarımızı değerlendirelim.

run içinde üç yeni eylem var:

  1. maxaxamWebCustomer örneğini oluşturun/güncelleştirin.
  2. NelapinWebCustomer örneğini oluşturun/güncelleştirin.
  3. createWebCustomerDocumentsIfNotExist çağrısı yapma ve maxaxam ile nelapin örneklerini liste olarak geçirme.

createWebCustomerDocumentsIfNotExist çağrısı iki WebCustomer örneğini de Azure Cosmos DB'ya öğe/belge olarak ekler. WebCustomer örneklerini liste olarak geçirmemizin amacı, POJO'ları minimum işlem kaynağı kullanarak ve hızlı bir şekilde Azure Cosmos DB'ye almak için yüksek performanslı bir yöntem modellemekti. createWebCustomerDocumentsIfNotExist, POJO listesindeki öğelerin verimli ve zaman uyumsuz bir şekilde eklenmesini sağlar. Herhangi bir belge zaten varsa, save belge oluşturmak yerine bir güncelleştirme gerçekleştirir.

İş parçacığı başına istek/saniye miktarını en üst düzeye çıkarmayı hedeflediğimizi düşünelim. Karşılaştıracak olursak createWebCustomerDocumentsIfNotExist yazmaya yönelik eşitleme yaklaşımı webCustomers içindeki her bir WebCustomer için yinele olacaktır. Her WebCustomerwebCustomeriçin öğesine engelleyici bir çağrı saveyaparız:

this.reactiveWebCustomerRepository.save(webCustomer).block(); // <= Note the .block() which loops until request response.

Bu eşitleme stili sezgisel bir süreç uygular: isteği gönder, yanıt bekle, bir sonraki isteği gönder. Ancak engelleme çağrıları istek yanıt süresi sırasında CPU döngülerini boşa harcayarak istek/saniye değerinin düşmesine neden olduğundan createWebCustomerDocumentsIfNotExist bu yaklaşımı kullanmaz.

Bu istek/saniye sorununun üstesinden gelmek için birden çok iş parçacığı üretebilir ve engelleme isteği çağrılarını paralel yürütebilirsiniz. Birden çok iş parçacığı, yürütme süresini iyileştirir. Ancak hedefiniz iş parçacığı kaynaklarını verimli bir şekilde kullanmaksa bu yaklaşım da işinizi görmeyecektir. Her iş parçacığı çok görevli çalışarak başka bir işle meşgul olmak yerine istek yanıt süresi sırasında döngü halinde çalıştırılır ve iş parçacığı başına istek/saniye değeri düşer.

Bu nedenle ve Java POJO'larının iş parçacıklarının verimli şekilde kullanılarak eklenmesini gösterme amacıyla belge ekleme sürecinin zaman uyumsuz bir örneğini sağladık. Spring Data zaman uyumsuz işlem desteği, zaman uyumsuz olay temelli programlama için akış tabanlı, bildirim temelli programlama modeli sunan bir Java uygulama çerçevesi olan Project Reactor tarafından sağlanır. createWebCustomerDocumentsIfNotExist, Project Reactor ile zaman uyumsuz programlama gerçekleştirir.

createWebCustomerDocumentsIfNotExist içinde Flux.fromIterable(webCustomers) bir Project Reactor fabrika yöntemidir. Bu yöntem zaman uyumsuz olayların kaynağı olan bir Flux örneği oluşturur. Bu durumda her bir zaman uyumsuz "olay" bir WebCustomer örneği bağımsız değişkeni içerir. Flux örneği biri maxaxam, biri de nelapin için olmak üzere aynı türde iki olay içerir. .flatMap( ... ).blockLast(); içindeki kod, Flux örneği tarafından gönderilen olaylar üzerinde gerçekleştirilecek sıralı işlemlerin bulunduğu işlem hattını tanımlar.

Bu durumda, işlem hattının iki işlemi save çağrılardır. Buradaki fikir, bu işlem hattının save çağrısının engellenmesi dışında zaman uyumlu uygulamaya benzer olduğudur. Özellikle, çağrısı blockLast()birleştirilmiş işlem hattına abone olur ve öğesinin zaman uyumsuz olarak iki olayını yaymasına neden olurFlux. Ardından .flatMap( ... ).blockLast(); içindeki işlem hattı ise bu olayların her birini paralel şekilde işler. Bir istek gönderildiğinde ve yanıt beklediğinde Project Reactor arka planda diğer istekleri işler ve bu da iş parçacığı başına istek/saniye değerini en üst düzeye çıkarma açısından kritik öneme sahiptir.

Project Reactor ile verimli zaman uyumsuz veritabanı isteklerini gördünüz. Kolaylık olması açısından bu laboratuvarın geri kalan kısmında engelleme zaman uyumsuz (etkin olarak zaman uyumlu) çağrılarını kullanacağız. Project Reactor hakkında daha fazla bilgi edinmek için Azure Cosmos DB Reactor Desen Kılavuzu'na bakın.

Belgeleri okuma

  1. Veritabanındaki belgeleri okumak için CosmosSample içine şu yöntemi ekleyin:

    /**
     * Take in a Java POJO argument, extract ID and partition key, and read the corresponding document from the container.
     * In this case the ID is the partition key.
     * @param webCustomer User POJO to pull ID and partition key from.
     */
    private WebCustomer readWebCustomerDocument(final WebCustomer webCustomer) {
        WebCustomer webCustomerResult = null;
    
        try {
            logger.info("Read webCustomer {}", webCustomer.getId());
            webCustomerResult = this.reactiveWebCustomerRepository.findById(webCustomer.getId(), new PartitionKey(webCustomer.getLastName())).block();
        } catch (CosmosException de) {
            logger.error("Failed to read webCustomer {}", webCustomer.getId(), de);
        }
    
        return webCustomer;
    }
    
  2. Aşağıdaki kodu kopyalayın ve run yönteminin sonuna, belge oluşturma kodunun altına yapıştırın:

    readWebCustomerDocument(maxaxam);
    
  3. CosmosSample.java uygulamasını IDE'de derleyip çalıştırın veya şu komutu kullanarak programı terminalde çalıştırın:

    mvn clean package
    mvn spring-boot:run
    

    Terminal çıkışında aşağıdakini görmeniz gerekir. "Okunan kullanıcı 1" belgenin alındığını gösterir.

    INFO: Read webCustomer 1
    

Belgeleri silme

  1. deleteWebCustomerDocument yöntemini kopyalayıp readWebCustomerDocument yönteminin altına yapıştırın.

    /**
     * Take in a Java POJO argument, extract ID and partition key,
     * and delete the corresponding document.
     * @param webCustomer User POJO representing the document update.
     */
    private void deleteWebCustomerDocument(final WebCustomer webCustomer) {
        try {
            this.reactiveWebCustomerRepository.deleteById(webCustomer.getId(),new PartitionKey(webCustomer.getLastName())).block();
            logger.info("Deleted webCustomer {}", webCustomer.getId());
        } catch (CosmosException de) {
            logger.error("User {} could not be deleted.", webCustomer.getId());
        }
    }
    
  2. Aşağıdaki kodu kopyalayın ve run yönteminin sonuna yapıştırın.

    deleteWebCustomerDocument(maxaxam);
    
  3. CosmosSample.java uygulamasını IDE'de derleyip çalıştırın veya şu komutu kullanarak programı terminalde çalıştırın:

    mvn clean package
    mvn spring-boot:run
    

    Terminal çıkışında aşağıdakini görmeniz gerekir. "Silinen kullanıcı 1" belgenin silindiğini gösterir.

    INFO: Deleted webCustomer 1
    

Bu ünitede Azure Cosmos DB veritabanınızda belgeler oluşturdunuz, bunları güncelleştirdiniz, okudunuz ve sildiniz.