Alıştırma - Azure Cosmos DB Java SDK’sını kullanarak sorgulama
Artık uygulamanızda belgeler oluşturduğunuza göre, bunları uygulamanızdan sorgulayabilirsiniz. Azure Cosmos DB Java SDK'sında SQL sorguları kullanılır. .NET SDK'sında LINQ sorguları için de destek sunulur ancak Java SDK'sında analog desteği yoktur. Bu ünite, portalın aksine uygulamanızdan SQL sorgularının çalıştırılması ile ilgilidir.
Bu sorguları test etmek için çevrimiçi şirket uygulamanız için oluşturduğunuz kullanıcı belgelerini kullanacağız.
SQL sorgusu çalıştırma
Aşağıdaki örnekte, Java kodunuzdan SQL ile nasıl sorgu gerçekleştirilebileceği gösterilmiştir. Kodu kopyalayıp CosmosApp.java dosyasının sonuna ekleyin.
/** * Execute a custom query on the Azure Cosmos DB container. * @param query Query String. */ private static void executeSimpleQuery(final String query) { final int preferredPageSize = 10; CosmosQueryRequestOptions queryOptions = new CosmosQueryRequestOptions(); CosmosPagedFlux<User> pagedFluxResponse = container.queryItems( query, queryOptions, User.class); logger.info("Running SQL query..."); pagedFluxResponse.byPage(preferredPageSize).flatMap(fluxResponse -> { logger.info("Got a page of query result with " + fluxResponse.getResults().size() + " items(s) and request charge of " + fluxResponse.getRequestCharge()); logger.info("Item Ids " + fluxResponse .getResults() .stream() .map(User::getId) .collect(Collectors.toList())); return Flux.empty(); }).blockLast(); }
Bu kodu incelerseniz yine Project Reactor'ın bildirim temelli veri akışı programlama modelini kullandığımızı görebilirsiniz. Modeli bu kez sorgu yanıtı sayfalarını zaman uyumsuz bir şekilde işlemek için kullanıyoruz. Gerçek kullanım örneğinde bir sorguya yüzlerce veya binlerce yanıt döndürülebileceğinden zaman uyumsuz yaklaşım kullanıyoruz. Sorgu yanıtlarını toplama işlemi, zaman uyumsuz programlama ile sunulan yüksek iş parçacığı verimliliğinden faydalanabilecek yoğun CPU kullanan bir görev olabilir.
Kısaca ifade etmek gerekirse sorgu yanıtlarını işleme sırasında yüksek aktarım hızı elde etmek veya iş parçacığı başına sayfa/saniye oranını artırmak istiyoruz.
queryitems
,CosmosPagedFlux
örneği olanpagedFluxResponse
öğesini döndürür,pagedFluxResponse.byPage(preferredPageSize)
ise zaman uyumsuz sayfa olaylarının kaynağı olanFlux
öğesini oluşturur..flatMap( ... ).blockLast();
içindeki operasyon işlem hattı,Flux
örneği tarafından yayılan her bir olayla ilişkili sorgu yanıt sayfasında zaman uyumsuz ve paralel bir şekilde çalışır.Aşağıdaki kodu kopyalayıp
basicOperations
yönteminize, belge silme kodunun öncesine yapıştırın.executeSimpleQuery("SELECT * FROM User WHERE User.lastName = 'Pindakova'");
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 çıkış şöyle görünmelidir:
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: Running SQL query... INFO: Got a page of query result with 1 items(s) and request charge of 2.83 INFO: Item Ids [2] INFO: Deleted User 1
Artık uygulamanızda belgeler oluşturduğunuza göre, bunları uygulamanızdan sorgulayabilirsiniz. Spring Data Azure Cosmos DB, türetilmiş sorgu yöntemlerinin yanı sıra özel sorgu yöntemlerini de kullanıma sunar - bunların ikisi de temel alınan Azure Cosmos DB Java SDK v4’ün SQL dili sorgu özelliklerini genişletir. Bu ünite, portalın aksine uygulamanızdan Spring Data Azure Cosmos DB sorgularının çalıştırılması ile ilgilidir.
Bu sorguları test etmek için çevrimiçi şirket uygulamanız için oluşturduğunuz WebCustomer
belgelerini kullanacağız.
Türetilen sorgu yöntemleri oluşturma ve çağırma
Türetilmiş sorgu yöntemleri, uygulama içermeyen Spring Data deposu yöntemleridir; bunun yerine, yöntem adı her yöntem çağrısını ve bağımsız değişkenlerini temel alınan veritabanındaki bir sorguya çevirmek için Spring Data’ya sinyal gönderir. Örneğin, bazı bağımsız değişkenlerle findById
çağırdığınızda Spring Data yöntem adını "kimliğe göre bul" olarak okur ve bağımsız değişkenler tarafından belirtilen belgeyi döndüren bir veritabanı sorgusu derler.
Spring Data Azure Cosmos DB, dahil çeşitli yerleşik findById
içerir. Bu bölümde, yeni türetilmiş sorgu yöntemlerinin nasıl uygulanacağını göstereceğiz.
firstName
alanı için belirli bir değere sahip tüm belgeleri sorgulayan türetilmiş bir sorgu yöntemi oluşturacağız. ReactiveWebCustomerRepository.java gidin. Aşağıdaki yöntem bildirimini görürsünüz:Flux<WebCustomer> findByFirstName(String firstName);
Bu depo yöntemi, çağrıldığında
firstName
öğesinde sorgulama yapan bir yöntemi istediğinizi Spring Data’ya bildirir.WebCustomer
sınıfının@Container
olarakcontainerName
belirten birWebCustomers
ek açıklaması ile başladığını hatırlayın.findByFirstName
Flux<WebCustomer>
döndürdüğünden, Spring Data bu yöntem çağrıldığındaWebCustomers
öğesini sorgulaması gerektiğini bilir.Aşağıdaki kodu kopyalayıp
run
yönteminize, çağrısınındeleteWebCustomerDocument
yapıştırın.logger.info("Running derived query..."); Flux<WebCustomer> webCustomers = reactiveWebCustomerRepository.findByFirstName("Max"); webCustomers.flatMap(webCustomer -> { logger.info("- WebCustomer is : {}", webCustomer.getUserId()); return Mono.empty(); }).blockLast();
Bu kodu incelerseniz yine Project Reactor'ın bildirim temelli veri akışı programlama modelini kullandığımızı görebilirsiniz. Modeli bu kez sorgu yanıtı sayfalarını zaman uyumsuz bir şekilde işlemek için kullanıyoruz. Gerçek kullanım örneğinde bir sorguya yüzlerce veya binlerce yanıt döndürülebileceğinden zaman uyumsuz yaklaşım kullanıyoruz. Sorgu yanıtlarını toplama işlemi, zaman uyumsuz programlama ile sunulan yüksek iş parçacığı verimliliğinden faydalanabilecek yoğun CPU kullanan bir görev olabilir.
Kısaca ifade etmek gerekirse sorgu yanıtlarını işleme sırasında yüksek aktarım hızı elde etmek veya iş parçacığı başına yanıt/saniye oranını artırmak istiyoruz.
findByFirstName
,Flux<WebCustomer>
örneğini (webCustomers
) döndürür..flatMap( ... ).blockLast();
içindeki operasyon işlem hattı,Flux<WebCustomer>
tarafından yayılan her bir olayla ilişkili sorgu yanıtlarında zaman uyumsuz ve paralel bir şekilde çalışır.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
Terminalde çıkış şöyle görünmelidir:
INFO: - WebCustomer is : maxaxam
Özel sorgu yöntemleri oluşturma ve çağırma
Özel sorgu yöntemleri, bir sorgu dizesi belirten @Query
ek açıklamasına sahip Spring Data deposu yöntemleridir ve sorgu dizesinde yöntem bağımsız değişkenleri için yer tutucular bulunur. Bu kez, yöntem adının hangi sorgunun gerçekleştirildiği üzerinde hiçbir etkisi yoktur.
@Query
ek açıklaması, bağımsız değişken yer tutucuları yöntem bağımsız değişkenlerinin değerleriyle doldurduktan sonra, Spring Data’ya temel veritabanına bir SQL dili sorgusu vermesi için sinyal gönderir.
lastName
alanı için belirli bir değere sahip tüm belgeleri sorgulayan özel bir sorgu yöntemi oluşturacağız. ReactiveWebCustomerRepository.java gidin. Aşağıdaki yöntem bildirimini görürsünüz:@Query(value = "SELECT * FROM User WHERE User.lastName = @lastName") Flux<WebCustomer> findByLastName(@Param("lastName") String lastName);
Bu depo yöntemi, çağrıldığında
lastName
öğesinde sorgulama yapan bir yöntemi istediğinizi Spring Data’ya bildirir.lastName
bağımsız değişken değeri,@lastName
yer tutucusunun yerine kullanılır.Aşağıdaki kodu kopyalayıp
run
yönteminize, türetilmiş sorgu kodunun sonrasına yapıştırın.logger.info("Running custom query..."); webCustomers = reactiveWebCustomerRepository.findByLastName("Axam"); webCustomers.flatMap(webCustomer -> { logger.info("- WebCustomer is : {}", webCustomer.getUserId()); return Mono.empty(); }).blockLast();
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
Terminalde çıkış şöyle görünmelidir:
INFO: Running derived query... INFO: - WebCustomer is : maxaxam INFO: Running custom query... INFO: - WebCustomer is : maxaxam
Bu ünitede, türetilmiş ve özel sorgular hakkında bilgi edindiniz. Ardından uygulamanıza kullanıcı kayıtlarını almak için her iki sorgu türünü de eklediniz.