azure-cosmos-java

npx skills add https://github.com/microsoft/skills --skill azure-cosmos-java

Azure Cosmos DB SDK pour Java

Bibliothèque cliente pour l'API NoSQL Azure Cosmos DB avec distribution mondiale et modèles réactifs.

Installation

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-cosmos</artifactId>
    <version>LATEST</version>
</dependency>

Ou utilisez Azure SDK BOM :

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-sdk-bom</artifactId>
            <version>{bom_version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-cosmos</artifactId>
    </dependency>
</dependencies>

Variables d'environnement

COSMOS_ENDPOINT=https://<account>.documents.azure.com:443/
COSMOS_KEY=<your-primary-key>

Authentification

Authentification par clé

import com.azure.cosmos.CosmosClient;
import com.azure.cosmos.CosmosClientBuilder;

CosmosClient client = new CosmosClientBuilder()
    .endpoint(System.getenv("COSMOS_ENDPOINT"))
    .key(System.getenv("COSMOS_KEY"))
    .buildClient();

Client asynchrone

import com.azure.cosmos.CosmosAsyncClient;

CosmosAsyncClient asyncClient = new CosmosClientBuilder()
    .endpoint(serviceEndpoint)
    .key(key)
    .buildAsyncClient();

Avec personnalisations

import com.azure.cosmos.ConsistencyLevel;
import java.util.Arrays;

CosmosClient client = new CosmosClientBuilder()
    .endpoint(serviceEndpoint)
    .key(key)
    .directMode(directConnectionConfig, gatewayConnectionConfig)
    .consistencyLevel(ConsistencyLevel.SESSION)
    .connectionSharingAcrossClientsEnabled(true)
    .contentResponseOnWriteEnabled(true)
    .userAgentSuffix("my-application")
    .preferredRegions(Arrays.asList("West US", "East US"))
    .buildClient();

Hiérarchie des classes

Classe Objectif
CosmosClient / CosmosAsyncClient Opérations au niveau du compte
CosmosDatabase / CosmosAsyncDatabase Opérations de base de données
CosmosContainer / CosmosAsyncContainer Opérations sur conteneur/élément

Flux de travail principal

Créer une base de données

// Sync
client.createDatabaseIfNotExists("myDatabase")
    .map(response -> client.getDatabase(response.getProperties().getId()));

// Async avec chaînage
asyncClient.createDatabaseIfNotExists("myDatabase")
    .map(response -> asyncClient.getDatabase(response.getProperties().getId()))
    .subscribe(database -> System.out.println("Created: " + database.getId()));

Créer un conteneur

asyncClient.createDatabaseIfNotExists("myDatabase")
    .flatMap(dbResponse -> {
        String databaseId = dbResponse.getProperties().getId();
        return asyncClient.getDatabase(databaseId)
            .createContainerIfNotExists("myContainer", "/partitionKey")
            .map(containerResponse -> asyncClient.getDatabase(databaseId)
                .getContainer(containerResponse.getProperties().getId()));
    })
    .subscribe(container -> System.out.println("Container: " + container.getId()));

Opérations CRUD

import com.azure.cosmos.models.PartitionKey;

CosmosAsyncContainer container = asyncClient
    .getDatabase("myDatabase")
    .getContainer("myContainer");

// Create
container.createItem(new User("1", "John Doe", "john@example.com"))
    .flatMap(response -> {
        System.out.println("Created: " + response.getItem());
        // Read
        return container.readItem(
            response.getItem().getId(),
            new PartitionKey(response.getItem().getId()),
            User.class);
    })
    .flatMap(response -> {
        System.out.println("Read: " + response.getItem());
        // Update
        User user = response.getItem();
        user.setEmail("john.doe@example.com");
        return container.replaceItem(
            user,
            user.getId(),
            new PartitionKey(user.getId()));
    })
    .flatMap(response -> {
        // Delete
        return container.deleteItem(
            response.getItem().getId(),
            new PartitionKey(response.getItem().getId()));
    })
    .block();

Interroger des documents

import com.azure.cosmos.models.CosmosQueryRequestOptions;
import com.azure.cosmos.util.CosmosPagedIterable;

CosmosContainer container = client.getDatabase("myDatabase").getContainer("myContainer");

String query = "SELECT * FROM c WHERE c.status = @status";
CosmosQueryRequestOptions options = new CosmosQueryRequestOptions();

CosmosPagedIterable<User> results = container.queryItems(
    query,
    options,
    User.class
);

results.forEach(user -> System.out.println("User: " + user.getName()));

Concepts clés

Clés de partition

Choisissez une clé de partition avec :

  • Cardinalité élevée (nombreuses valeurs distinctes)
  • Distribution équilibrée des données et des requêtes
  • Utilisation fréquente dans les requêtes

Niveaux de cohérence

Niveau Garantie
Strong Linéarité
Bounded Staleness Cohérence des préfixes avec délai limité
Session Cohérence des préfixes au sein de la session
Consistent Prefix Les lectures ne voient jamais les écritures désordonnées
Eventual Aucune garantie d'ordre

Unités de requête (RUs)

Toutes les opérations consomment des RUs. Vérifiez les en-têtes de réponse :

CosmosItemResponse<User> response = container.createItem(user);
System.out.println("RU charge: " + response.getRequestCharge());

Bonnes pratiques

  1. Réutilisez CosmosClient — Créez une fois, réutilisez dans toute l'application
  2. Utilisez le client asynchrone pour les scénarios haut débit
  3. Choisissez la clé de partition avec soin — Affecte les performances et l'évolutivité
  4. Activez la réponse de contenu à l'écriture pour accéder immédiatement aux éléments créés
  5. Configurez les régions préférées pour les applications géo-distribuées
  6. Gérez les erreurs 429 avec des stratégies de retry (activées par défaut)
  7. Utilisez le mode direct pour la latence la plus faible en production

Gestion des erreurs

import com.azure.cosmos.CosmosException;

try {
    container.createItem(item);
} catch (CosmosException e) {
    System.err.println("Status: " + e.getStatusCode());
    System.err.println("Message: " + e.getMessage());
    System.err.println("Request charge: " + e.getRequestCharge());

    if (e.getStatusCode() == 409) {
        System.err.println("Item already exists");
    } else if (e.getStatusCode() == 429) {
        System.err.println("Rate limited, retry after: " + e.getRetryAfterDuration());
    }
}

Liens de référence

Ressource URL
Package Maven https://central.sonatype.com/artifact/com.azure/azure-cosmos
Documentation API https://azuresdkdocs.z19.web.core.windows.net/java/azure-cosmos/latest/index.html
Documentation produit https://learn.microsoft.com/azure/cosmos-db/
Exemples https://github.com/Azure-Samples/azure-cosmos-java-sql-api-samples
Guide des performances https://learn.microsoft.com/azure/cosmos-db/performance-tips-java-sdk-v4-sql
Dépannage https://learn.microsoft.com/azure/cosmos-db/troubleshoot-java-sdk-v4-sql

Skills similaires