SDK Azure Cosmos DB 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 basée sur les clés
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 clients
| Classe | Objectif |
|---|---|
CosmosClient / CosmosAsyncClient |
Opérations au niveau du compte |
CosmosDatabase / CosmosAsyncDatabase |
Opérations de base de données |
CosmosContainer / CosmosAsyncContainer |
Opérations de conteneur/élément |
Flux de travail principal
Créer une base de données
// Synchrone
client.createDatabaseIfNotExists("myDatabase")
.map(response -> client.getDatabase(response.getProperties().getId()));
// Asynchrone 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");
// Créer
container.createItem(new User("1", "John Doe", "john@example.com"))
.flatMap(response -> {
System.out.println("Created: " + response.getItem());
// Lire
return container.readItem(
response.getItem().getId(),
new PartitionKey(response.getItem().getId()),
User.class);
})
.flatMap(response -> {
System.out.println("Read: " + response.getItem());
// Mettre à jour
User user = response.getItem();
user.setEmail("john.doe@example.com");
return container.replaceItem(
user,
user.getId(),
new PartitionKey(user.getId()));
})
.flatMap(response -> {
// Supprimer
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 uniforme des données et des demandes
- Utilisation fréquente dans les requêtes
Niveaux de cohérence
| Niveau | Garantie |
|---|---|
| Strong | Linéarité |
| Bounded Staleness | Préfixe cohérent avec décalage limité |
| Session | Préfixe cohérent dans la session |
| Consistent Prefix | Les lectures ne voient jamais les écritures désordonnées |
| Eventual | Aucune garantie de classement |
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
- Réutilisez CosmosClient — Créez une seule fois, réutilisez dans toute l'application
- Utilisez le client asynchrone pour les scénarios à débit élevé
- Choisissez la clé de partition avec soin — Affecte les performances et l'extensibilité
- Activez la réponse de contenu à l'écriture pour accéder immédiatement aux éléments créés
- Configurez les régions préférées pour les applications géo-distribuées
- Gérez les erreurs 429 avec les politiques de nouvelle tentative (intégrées par défaut)
- 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 de performance | 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 |