Azure Spring Data Cosmos-Clientbibliothek für Java– Version 5.6.0
Azure Spring Data Cosmos bietet Spring Data-Unterstützung für Azure Cosmos DB unter Verwendung der SQL-API auf der Grundlage des Spring Data-Frameworks. Azure Cosmos DB ist ein global verteilter Datenbankdienst, der Entwicklern durch eine Vielzahl von Standard-APIs wie SQL, MongoDB, Cassandra, Graph und Tabellen die Arbeit mit Daten ermöglicht.
Spring Boot-Supportrichtlinie
Dieses Projekt unterstützt mehrere Spring Boot-Versionen. Eine vollständige Liste der derzeit unterstützten Versionen finden Sie in der Spring-Versionszuordnung.
Spring Boot-Releases werden mit „Ende der Lebensdauer“ gekennzeichnet, wenn sie nicht mehr unterstützt oder in irgendeiner Form veröffentlicht werden. Wenn Sie eine EOL-Version ausführen, sollten Sie schnellstmöglich ein Upgrade durchführen.
Bitte beachten Sie, dass eine Version nicht mehr unterstützt werden kann, bevor sie als "Ende der Lebensdauer" gekennzeichnet wird. Während dieser Zeit sollten Sie nur Releases für kritische Fehler oder Sicherheitsprobleme erwarten.
Weitere Informationen zu unterstützten Spring Boot-Versionen finden Sie unter Unterstützte Spring Boot-Versionen.
Versionsunterstützung für Spring Boot
Maven-Benutzer können mittels Vererbung aus dem Projekt spring-boot-starter-parent
einen Abschnitt zur Abhängigkeitsverwaltung beziehen, um Spring die Versionsverwaltung für Abhängigkeiten zu überlassen.
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
</parent>
Bei diesem Setup können Sie auch einzelne Abhängigkeiten überschreiben, indem Sie eine Eigenschaft in Ihrem eigenen Projekt überschreiben. Wenn Sie beispielsweise ein Upgrade auf einen anderen Spring Data-Releasetrain durchführen möchten, können Sie der Datei „pom.xml“ Folgendes hinzufügen:
<properties>
<spring-data-releasetrain.version>${spring.data.version}</spring-data-releasetrain.version>
</properties>
Wenn Sie spring-boot-starter-parent
nicht verwenden möchten, können Sie auch von der Abhängigkeitsverwaltung profitieren, indem Sie eine Abhängigkeit vom Typ scope=import
nutzen:
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Welche Version von Azure Spring Data Cosmos sollte ich verwenden?
Zuordnung von Spring Boot / Spring Cloud-Version zu Azure Spring Data Cosmos-Versionen
Spring Boot-Version | Spring Cloud-Version | Azure Spring Data Cosmos-Versionen |
---|---|---|
3.0.x | 2022.0.x | 5.3.0 und höher |
2.7.x | 2021.0.x | 3.23.0 und höher |
2.6.x | 2021.0.x | 3.15.0 - 3.22.0 |
2.5.x | 2020.0.x | 3.8.0 - 3.14.0 |
2.4.x | 2020.0.x | 3.5.0 - 3.7.0 |
Ich verwende Spring Boot Version X
Wenn Sie Spring Boot in Ihrem Projekt verwenden, finden Sie die zugehörigen Azure Spring Data Cosmos-Versionen aus der obigen Tabelle. Beispiel: Wenn Sie Spring Boot 3.0.x verwenden, sollten Sie Die Azure Spring Data Cosmos-Versionen 5.3.0 und höher verwenden.
Ich verwende Spring Cloud Version Y
Wenn Sie Spring Cloud in Ihrem Projekt verwenden, finden Sie auch verwandte Azure Spring Data Cosmos-Versionen aus der obigen Tabelle. Wenn Sie beispielsweise Spring Cloud 2022.0.x verwenden, sollten Sie Die Azure Spring Data Cosmos-Versionen 5.3.0 und höher verwenden.
Versionsunterstützung für Spring Data
Dieses Projekt unterstützt spring-data-commons 3.0.x
Versionen.
Das obige Setup ermöglicht es Ihnen nicht, einzelne Abhängigkeiten mit einer -Eigenschaft wie oben erläutert zu überschreiben. Um das gleiche Ergebnis zu erzielen, müssen Sie vor dem Eintrag spring-boot-dependencies
einen Eintrag in der Abhängigkeitsverwaltung (dependencyManagement) Ihres Projekts hinzufügen. Wenn Sie beispielsweise ein Upgrade auf einen anderen Spring Data-Releasetrain durchführen möchten, können Sie der Datei „pom.xml“ Folgendes hinzufügen:
<dependencyManagement>
<dependencies>
<!-- Override Spring Data release train provided by Spring Boot -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-releasetrain</artifactId>
<version>${spring.data.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Hinweis: Ersetzen Sie ${spring.boot.version} und ${spring.data.version} durch die Versionen von Spring Boot und Spring Data, die Sie in Ihrem Projekt verwenden möchten.
Erste Schritte
Einschließen des Pakets
Falls Sie bei Verwendung von Maven die folgende Abhängigkeit hinzu:
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-spring-data-cosmos</artifactId>
<version>5.6.0</version>
</dependency>
Voraussetzungen
- Java Development Kit (JDK), Version 8 oder höher
- Ein aktives Azure-Konto. Wenn Sie keines besitzen, können Sie sich für ein kostenloses Kontoregistrieren. Zu Entwicklungs- und Testzwecken können Sie alternativ den Azure Cosmos DB-Emulator verwenden. Da das Https-Zertifikat des Emulators selbstsigniert ist, müssen Sie das Zertifikat in den vertrauenswürdigen Java-Zertifikatspeicher importieren, wie hier erläutert.
- (Optional) SLF4J ist eine Protokollierungsfassade.
- (Optional) Die SLF4J-Bindung wird verwendet, um SLF4J ein bestimmtes Protokollierungsframework zuzuordnen.
- (Optional) Maven
SLF4J ist nur erforderlich, wenn Sie die Protokollierung verwenden möchten. Laden Sie außerdem eine SLF4J-Bindung herunter, um die SLF4J-API mit der Protokollierungsimplementierung Ihrer Wahl zu verknüpfen. Weitere Informationen finden Sie im SLF4J-Benutzerhandbuch.
Einrichten der Konfigurationsklasse
Um die Konfigurationsklasse einzurichten, müssen Sie
AbstractCosmosConfiguration
erweitern.Azure-spring-data-cosmos unterstützt
Response Diagnostics String
auch ,Query Metrics
undMax Degree of Parallelism
. Legen Sie das FlagqueryMetricsEnabled
in „application.properties“ auf „true“ fest, um Abfragemetriken zu aktivieren. Implementieren Sie außerdemResponseDiagnosticsProcessor
, um Diagnoseinformationen zu protokollieren. Legen SiemaxDegreeOfParallelism
das Flag in application.properties auf eine ganze Zahl fest, um die parallele Verarbeitung zu ermöglichen. Wenn Sie den Wert auf -1 festlegen, entscheidet das SDK über den optimalen Wert. Legen SiemaxBufferedItemCount
das Flag in application.properties auf eine ganze Zahl fest, damit der Benutzer die maximale Anzahl von Elementen festlegen kann, die während der parallelen Abfrageausführung gepuffert werden können. Wenn dieser Wert auf kleiner als 0 festgelegt ist, entscheidet das System automatisch über die Anzahl der zu puffernden Elemente. HINWEIS: Wenn Sie diesen Wert auf einen sehr hohen Wert festlegen, kann dies zu einem hohen Speicherverbrauch führen. Legen SieresponseContinuationTokenLimitInKb
das Flag in application.properties auf eine ganze Zahl fest, damit der Benutzer die Länge des Fortsetzungstokens in der Abfrageantwort einschränken kann. Das Fortsetzungstoken enthält sowohl erforderliche als auch optionale Felder. Die erforderlichen Felder sind erforderlich, um die Ausführung dort fortzusetzen, wo sie beendet wurde. Die optionalen Felder können serialisierte Indexsuchevorgänge enthalten, die abgeschlossen, aber noch nicht verwendet wurden. Dadurch wird vermieden, dass die Arbeit in nachfolgenden Fortsetzungen erneut ausgeführt wird und somit die Abfrageleistung verbessert wird. Wenn Sie die maximale Fortsetzungsgröße auf 1 KB festlegen, serialisiert der Azure Cosmos DB-Dienst nur erforderliche Felder. Ab 2 KB würde der Azure Cosmos DB-Dienst so viel serialisieren, wie er passen könnte, bis er die maximale angegebene Größe erreicht. Legen SiepointOperationLatencyThresholdInMS
,requestChargeThresholdInRU
nonPointOperationLatencyThresholdInMS
undpayloadSizeThresholdInBytes
fest, um Diagnose auf Clientebene zu aktivieren, wenn diese Schwellenwerte überschritten werden.
@Configuration
@EnableCosmosRepositories
public class AppConfiguration extends AbstractCosmosConfiguration {
private static final Logger LOGGER = LoggerFactory.getLogger(AppConfiguration.class);
@Value("${azure.cosmos.uri}")
private String uri;
@Value("${azure.cosmos.key}")
private String key;
@Value("${azure.cosmos.secondaryKey}")
private String secondaryKey;
@Value("${azure.cosmos.database}")
private String dbName;
@Value("${azure.cosmos.queryMetricsEnabled}")
private boolean queryMetricsEnabled;
@Value("${azure.cosmos.maxDegreeOfParallelism}")
private int maxDegreeOfParallelism;
@Value("${azure.cosmos.maxBufferedItemCount}")
private int maxBufferedItemCount;
@Value("${azure.cosmos.responseContinuationTokenLimitInKb}")
private int responseContinuationTokenLimitInKb;
@Value("${azure.cosmos.diagnosticsThresholds.pointOperationLatencyThresholdInMS}")
private int pointOperationLatencyThresholdInMS;
@Value("${azure.cosmos.diagnosticsThresholds.nonPointOperationLatencyThresholdInMS}")
private int nonPointOperationLatencyThresholdInMS;
@Value("${azure.cosmos.diagnosticsThresholds.requestChargeThresholdInRU}")
private int requestChargeThresholdInRU;
@Value("${azure.cosmos.diagnosticsThresholds.payloadSizeThresholdInBytes}")
private int payloadSizeThresholdInBytes;
private AzureKeyCredential azureKeyCredential;
@Bean
public CosmosClientBuilder getCosmosClientBuilder() {
this.azureKeyCredential = new AzureKeyCredential(key);
DirectConnectionConfig directConnectionConfig = new DirectConnectionConfig();
GatewayConnectionConfig gatewayConnectionConfig = new GatewayConnectionConfig();
return new CosmosClientBuilder()
.endpoint(uri)
.credential(azureKeyCredential)
.directMode(directConnectionConfig, gatewayConnectionConfig)
.clientTelemetryConfig(
new CosmosClientTelemetryConfig()
.diagnosticsThresholds(
new CosmosDiagnosticsThresholds()
.setNonPointOperationLatencyThreshold(Duration.ofMillis(nonPointOperationLatencyThresholdInMS))
.setPointOperationLatencyThreshold(Duration.ofMillis(pointOperationLatencyThresholdInMS))
.setPayloadSizeThreshold(payloadSizeThresholdInBytes)
.setRequestChargeThreshold(requestChargeThresholdInRU)
)
.diagnosticsHandler(CosmosDiagnosticsHandler.DEFAULT_LOGGING_HANDLER));
}
@Override
public CosmosConfig cosmosConfig() {
return CosmosConfig.builder()
.enableQueryMetrics(queryMetricsEnabled)
.maxDegreeOfParallelism(maxDegreeOfParallelism)
.maxBufferedItemCount(maxBufferedItemCount)
.responseContinuationTokenLimitInKb(responseContinuationTokenLimitInKb)
.responseDiagnosticsProcessor(new ResponseDiagnosticsProcessorImplementation())
.build();
}
public void switchToSecondaryKey() {
this.azureKeyCredential.update(secondaryKey);
}
@Override
protected String getDatabaseName() {
return "testdb";
}
private static class ResponseDiagnosticsProcessorImplementation implements ResponseDiagnosticsProcessor {
@Override
public void processResponseDiagnostics(@Nullable ResponseDiagnostics responseDiagnostics) {
LOGGER.info("Response Diagnostics {}", responseDiagnostics);
}
}
}
Anpassen der Konfiguration
Sie können oder GatewayConnectionConfig
oder beide anpassen DirectConnectionConfig
und bereitstellen, um CosmosAsyncClient
sie anzupassenCosmosClientBuilder
. Sie können pointOperationLatencyThresholdInMS
, nonPointOperationLatencyThresholdInMS
requestChargeThresholdInRU
und payloadSizeThresholdInBytes
die Schwellenwerte für die Diagnoseprotokollierung anpassen, wenn sie mit CosmosDiagnosticsHandler
kombiniert werden, wodurch die Diagnoseprotokollierung mit den Standardschwellenwerten aktiviert wird, wenn sie CosmosClientBuilder
dem hinzugefügt werden.
@Bean
public CosmosClientBuilder getCosmosClientBuilder() {
DirectConnectionConfig directConnectionConfig = new DirectConnectionConfig();
GatewayConnectionConfig gatewayConnectionConfig = new GatewayConnectionConfig();
return new CosmosClientBuilder()
.endpoint(uri)
.directMode(directConnectionConfig, gatewayConnectionConfig)
.clientTelemetryConfig(
new CosmosClientTelemetryConfig()
.diagnosticsThresholds(
new CosmosDiagnosticsThresholds()
.setNonPointOperationLatencyThreshold(Duration.ofMillis(nonPointOperationLatencyThresholdInMS))
.setPointOperationLatencyThreshold(Duration.ofMillis(pointOperationLatencyThresholdInMS))
.setPayloadSizeThreshold(payloadSizeThresholdInBytes)
.setRequestChargeThreshold(requestChargeThresholdInRU)
)
.diagnosticsHandler(CosmosDiagnosticsHandler.DEFAULT_LOGGING_HANDLER));
}
@Override
public CosmosConfig cosmosConfig() {
return CosmosConfig.builder()
.enableQueryMetrics(queryMetricsEnabled)
.maxDegreeOfParallelism(maxDegreeOfParallelism)
.maxBufferedItemCount(maxBufferedItemCount)
.responseContinuationTokenLimitInKb(responseContinuationTokenLimitInKb)
.responseDiagnosticsProcessor(new ResponseDiagnosticsProcessorImplementation())
.build();
}
Standardmäßig wird durch @EnableCosmosRepositories
das aktuelle Paket auf Schnittstellen überprüft, die eine der Repositoryschnittstellen von Spring Data erweitern.
Kommentieren Sie damit Ihre Configuration-Klasse, um ein anderes Stammpaket mittels @EnableCosmosRepositories(basePackageClass=UserRepository.class)
zu überprüfen, wenn Ihr Projektlayout mehrere Projekte umfasst.
Aktivieren von Protokollierungs-Diagnose für Azure-Anwendung Insights mit JavaAgent
Die Diagnose kann aktiviert werden, indem Sie den JavaAgent wie folgt an Ihre Anwendung übergeben. Dadurch wird die Protokollierung mit den Standardschwellenwerten aktiviert. Der "-javaagent" muss vor dem "-jar" übergeben werden.
java -javaagent:"<path-to-applicationinsights-agent-jar>" -jar <myapp.jar>
Verwenden des bereitgestellten Datenbankdurchsatzes
Cosmos unterstützt sowohl container - als auch datenbankseitig bereitgestellten Durchsatz. Standardmäßig stellt spring-data-cosmos den Durchsatz für jeden erstellten Container bereit. Wenn Sie den Durchsatz zwischen Containern gemeinsam nutzen möchten, können Sie den von der Datenbank bereitgestellten Durchsatz über CosmosConfig aktivieren.
@Override
public CosmosConfig cosmosConfig() {
int autoscale = false;
int initialRequestUnits = 400;
return CosmosConfig.builder()
.enableDatabaseThroughput(autoscale, initialRequestUnits)
.build();
}
Definieren einer Entität
Definieren Sie eine einfache Entität als Element in Azure Cosmos DB.
Sie können Entitäten definieren, indem Sie die Anmerkung
@Container
hinzufügen und Eigenschaften im Zusammenhang mit dem Container angeben, etwa den Containernamen, Anforderungseinheiten (Request Units, RUs), die Gültigkeitsdauer und die automatische Containererstellung.Container werden standardmäßig automatisch erstellt. Wenn Sie die automatische Containererstellung deaktivieren möchten, legen Sie
autoCreateContainer
in der Anmerkung@Container
auf „false“ fest.Hinweis: Neu erstellten Containern werden standardmäßig 400 Anforderungseinheiten zugewiesen. Geben Sie einen anderen RU-Wert an, um Anforderungseinheiten für den vom SDK erstellten Container anzupassen. (Der Mindestwert für RUs ist 400.)
@Container(containerName = "myContainer", ru = "400")
public class User {
private String id;
private String firstName;
@PartitionKey
private String lastName;
public User() {
// If you do not want to create a default constructor,
// use annotation @JsonCreator and @JsonProperty in the full args constructor
}
public User(String id, String firstName, String lastName) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
}
@Override
public String toString() {
return String.format("User: %s %s, %s", firstName, lastName, id);
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
id
feld wird als Element-ID in Azure Cosmos DB verwendet. Wenn Sie ein anderes Feld wie alsfirstName
Elementid
verwenden möchten, kommentieren Sie dieses Feld einfach mit@Id
Anmerkungen.Die Anmerkung
@Container(containerName="myContainer")
gibt den Containernamen in Azure Cosmos DB an.Die Anmerkung
@PartitionKey
für das FeldlastName
macht dieses Feld zum Partitionsschlüssel in Azure Cosmos DB.
Erstellen von Containern mit automatisch skaliertem Durchsatz
- Die Anmerkung
autoScale
für das Feld gibt an, dass der Container mit automatisch skaliertem Durchsatz erstellt werden soll, wenn die Option auf „true“ festgelegt wird. Der Standardwert ist „false“. In diesem Fall werden Container mit manuellem Durchsatz erstellt. - Weitere Informationen zum automatisch skalierten Durchsatz finden Sie hier.
@Container(containerName = "myContainer", autoScale = true, ru = "4000")
public class UserSample {
@Id
private String emailAddress;
}
Unterstützung geschachtelter Partitionsschlüssel
- Azure Spring Data Cosmos unterstützt geschachtelten Partitionsschlüssel. Verwenden Sie zum Hinzufügen eines geschachtelten Partitionsschlüssels das Feld
partitionKeyPath
in der Anmerkung@Container
. partitionKeyPath
sollte nur zur Unterstützung des Pfads für geschachtelte Partitionsschlüssel verwendet werden. Verwenden Sie zur allgemeinen Unterstützung von Partitionsschlüsseln die Anmerkung@PartitionKey
.- Die Anmerkung
@PartitionKey
hat standardmäßig Vorrang, sofern angegeben. - Das folgende Beispiel zeigt die ordnungsgemäße Verwendung des Features für geschachtelte Partitionsschlüssel:
@Container(containerName = "nested-partition-key", partitionKeyPath = "/nestedEntitySample/nestedPartitionKey")
public class NestedPartitionKeyEntitySample {
private NestedEntitySample nestedEntitySample;
}
public class NestedEntitySample {
private String nestedPartitionKey;
}
Erstellen von Repositorys
Erweitert die CosmosRepository-Schnittstelle zur Unterstützung von Spring Data-Repositorys.
@Repository
public interface UserRepository extends CosmosRepository<User, String> {
Iterable<User> findByFirstName(String firstName);
long countByFirstName(String firstName);
User findOne(String id, String lastName);
}
- Die Methode
findByFirstName
ist eine benutzerdefinierte Abfragemethode, die Elemente anhand des Vornamens (firstName) sucht.
Zwischenspeichern von Abfrageplänen
Spring-Repository-Abfrage-APIs wie findByFirstName(String firstName)
die firstName
Partition oder kommentierte Abfragen mit Partitionsschlüssel führen aufgrund der Zwischenspeicherung des Abfrageplans zu einer geringeren Ausführungszeit der Abfrage. Derzeit wird das Zwischenspeichern von Abfrageplänen nur für Abfragemethoden unterstützt, die auf eine einzelne Partition abzielen.
QueryAnnotation: Verwenden von Abfragen mit Anmerkungen in Repositorys
Azure Spring Data Cosmos unterstützt das Angeben von Abfragen mit Anmerkungen in den Repositorys mithilfe von @Query
.
- Beispiele für Abfragen mit Anmerkungen in „CosmosRepository“ (synchron):
public interface AnnotatedQueriesUserRepositoryCodeSnippet extends CosmosRepository<User, String> {
@Query("select * from c where c.firstName = @firstName and c.lastName = @lastName")
List<User> getUsersByFirstNameAndLastName(@Param("firstName") String firstName, @Param("lastName") String lastName);
@Query("select * from c offset @offset limit @limit")
List<User> getUsersWithOffsetLimit(@Param("offset") int offset, @Param("limit") int limit);
@Query("select value count(1) from c where c.firstName = @firstName")
long getNumberOfUsersWithFirstName(@Param("firstName") String firstName);
}
- Beispiele für Abfragen mit Anmerkungen in „ReactiveCosmosRepository“:
public interface AnnotatedQueriesUserReactiveRepositoryCodeSnippet extends ReactiveCosmosRepository<User, String> {
@Query("select * from c where c.firstName = @firstName and c.lastName = @lastName")
Flux<User> getUsersByTitleAndValue(@Param("firstName") int firstName, @Param("lastName") String lastName);
@Query("select * from c offset @offset limit @limit")
Flux<User> getUsersWithOffsetLimit(@Param("offset") int offset, @Param("limit") int limit);
@Query("select count(c.id) as num_ids, c.lastName from c group by c.lastName")
Flux<ObjectNode> getCoursesGroupByDepartment();
@Query("select value count(1) from c where c.lastName = @lastName")
Mono<Long> getNumberOfUsersWithLastName(@Param("lastName") String lastName);
}
Die in der Anmerkung angegebenen Abfragen sind identisch mit den Cosmos-Abfragen. Weitere Informationen zu SQL-Abfragen in Cosmos finden Sie in den folgenden Artikeln:
- [Sql API Query Erste Schritte] sql_queries_getting_started
- [Sql-API-Abfragetutorial] sql_queries_in_cosmos
Erstellen einer Anwendungsklasse
Hier wird eine Anwendungsklasse mit allen Komponenten erstellt:
@SpringBootApplication
public class SampleApplication implements CommandLineRunner {
@Autowired
private UserRepository repository;
@Autowired
private ApplicationContext applicationContext;
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
}
public void run(String... var1) {
final User testUser = new User("testId", "testFirstName", "testLastName");
repository.deleteAll();
repository.save(testUser);
// to find by Id, please specify partition key value if collection is partitioned
final User result = repository.findOne(testUser.getId(), testUser.getLastName());
// Switch to secondary key
UserRepositoryConfiguration bean =
applicationContext.getBean(UserRepositoryConfiguration.class);
bean.switchToSecondaryKey();
// Now repository will use secondary key
repository.save(testUser);
}
}
- Verwenden Sie Autowiring für die UserRepository-Schnittstelle, um Vorgänge wie Speichern, Löschen, Suchen usw. auszuführen.
- Von Spring Data Azure Cosmos DB werden
CosmosTemplate
undReactiveCosmosTemplate
verwendet, um die Abfragen hinter Methoden vom Typ find und save auszuführen. Die Vorlage kann von Ihnen auch für komplexere Abfragen verwendet werden.
Wichtige Begriffe
„CrudRepository“ und „ReactiveCrudRepository“
- Von Azure Spring Data Cosmos werden „ReactiveCrudRepository“ und „CrudRepository“ unterstützt, um grundlegende CRUD-Funktionen bereitzustellen.
- save
- findAll
- findOne nach ID
- deleteAll
- löschen nach ID
- delete (Entität)
Spring Data-Anmerkungen
Spring Data @Id Anmerkung
Es gibt zwei Möglichkeiten, ein Feld in der Domänenklasse dem Feld id
eines Azure Cosmos DB-Elements zuzuordnen.
- Sie können ein Feld in der Domänenklasse mit der Anmerkung
@Id
versehen, um dieses Feld dem Elementid
in Cosmos DB zuzuordnen. - Sie können den Namen des Felds auf
id
festlegen, um dieses Feld dem Elementid
in Azure Cosmos DB zuzuordnen.
Automatische ID-Generierung
- Unterstützt die automatische Generierung von Zeichenfolgentyp-UUIDs mithilfe der Anmerkung @GeneratedValue. Das ID-Feld einer Entität mit einer Zeichenfolgentyp-ID kann mit
@GeneratedValue
versehen werden, um vor dem Einfügen automatisch eine zufällige UUID zu generieren.
public class GeneratedIdEntity {
@Id
@GeneratedValue
private String id;
}
SpEL-Ausdruck und benutzerdefinierter Containername.
- Standardmäßig ist der Containername der Klassenname der Benutzerdomänenklasse. Fügen Sie zum Anpassen der Domänenklasse die Anmerkung
@Container(containerName="myCustomContainerName")
hinzu. Das Containerfeld unterstützt auch SpEL-Ausdrücke (z. B.container = "${dynamic.container.name}"
odercontainer = "#{@someBean.getContainerName()}"
), um Containernamen programmgesteuert/über Konfigurationseigenschaften bereitzustellen. - Damit SpEL-Ausdrücke ordnungsgemäß funktionieren, muss neben der Spring-Anwendungsklasse auch
@DependsOn("expressionResolver")
hinzugefügt werden.
@SpringBootApplication
@DependsOn("expressionResolver")
public class SampleApplication {
}
Indizierungsrichtlinien
- IndexingPolicy wird standardmäßig vom Azure-Portaldienst festgelegt. Fügen Sie zum Anpassen die Anmerkung
@CosmosIndexingPolicy
zur Domänenklasse hinzu. Diese Anmerkung hat 5 Attribute, die angepasst werden müssen. Weitere Informationen finden Sie unter:
// Indicate if indexing policy use automatic or not
// Default value is true
boolean automatic() default Constants.DEFAULT_INDEXING_POLICY_AUTOMATIC;
// Indexing policy mode, option Consistent.
IndexingMode mode() default IndexingMode.CONSISTENT;
// Included paths for indexing
String[] includePaths() default {};
// Excluded paths for indexing
String[] excludePaths() default {};
Eindeutige Schlüsselrichtlinie
- Azure Spring Data Cosmos unterstützt das Festlegen
UniqueKeyPolicy
für container, indem die Anmerkung@CosmosUniqueKeyPolicy
zur Domänenklasse hinzugefügt wird. Diese Anmerkung weist die folgenden Attribute auf:
@Container
@CosmosUniqueKeyPolicy(uniqueKeys = {
@CosmosUniqueKey(paths = {"/lastName", "/zipCode"}),
@CosmosUniqueKey(paths = {"/city"})
})
public class CosmosUniqueKeyPolicyCodeSnippet {
@Id
String id;
@PartitionKey
String firstName;
String lastName;
String zipCode;
String city;
}
Azure Cosmos DB-Partition
- Von „Azure-spring-data-cosmos“ wird die Azure Cosmos DB-Partition unterstützt.
- Wenn Sie ein Feld der Domänenklasse als Partitionsschlüsselfeld angeben möchten, versehen Sie es einfach mit der Anmerkung
@PartitionKey
. - Geben Sie beim Ausführen eines CRUD-Vorgangs Ihren Partitionswert an.
- Weitere Beispiele zu CRUD-Vorgängen für Partitionen finden Sie hier.
Optimistische Sperre
- Von „Azure-spring-data-cosmos“ wird die optimistische Sperre für bestimmte Container unterstützt. Das bedeutet, dass bei elementspezifischen Upsert-/Löschvorgängen ein Ausnahmefehler auftritt, wenn das Element inzwischen durch einen anderen Prozess geändert wird.
- Um die optimistische Sperre für einen Container zu aktivieren, erstellen Sie einfach ein Zeichenfolgenfeld vom Typ
_etag
, und versehen Sie es mit der Anmerkung@Version
. Weitere Informationen finden Sie in den folgenden Themen:
@Container(containerName = "myContainer")
public class MyItem {
String id;
String data;
@Version
String _etag;
}
- Weitere Informationen zur optimistischen Sperre finden Sie hier.
Benutzerdefinierte Spring Data-Abfrage, Paginierung und Sortierung
- Von „Azure-spring-data-cosmos“ werden benutzerdefinierte Spring Data-Abfragen unterstützt.
- Beispiel für Suchvorgang:
findByAFieldAndBField
- Unterstützt „Pageable“, „Slice“ und „Sort“ von Spring Data.
- Basierend auf den verfügbaren RUs für das Datenbankkonto kann Cosmos DB Elemente zurückgeben, die kleiner als die angeforderte Größe sind oder der angeforderten Größe entsprechen.
- Aufgrund dieser in jeder Iteration variablen Anzahl zurückgegebener Elemente sollte sich der Benutzer nicht auf „totalPageSize“ verlassen, sondern stattdessen Iterationen auf der Grundlage von „pageable“ verwenden.
private List<T> findAllWithPageSize(int pageSize) {
final CosmosPageRequest pageRequest = new CosmosPageRequest(0, pageSize, null);
Page<T> page = repository.findAll(pageRequest);
List<T> pageContent = page.getContent();
while (page.hasNext()) {
Pageable nextPageable = page.nextPageable();
page = repository.findAll(nextPageable);
pageContent = page.getContent();
}
return pageContent;
}
public interface SliceQueriesUserRepository extends CosmosRepository<User, String> {
@Query("select * from c where c.lastName = @lastName")
Slice<User> getUsersByLastName(@Param("lastName") String lastName, Pageable pageable);
}
private List<User> getUsersByLastName(String lastName, int pageSize) {
final CosmosPageRequest pageRequest = new CosmosPageRequest(0, pageSize, null);
Slice<User> slice = repository.getUsersByLastName(lastName, pageRequest);
List<User> content = slice.getContent();
while (slice.hasNext()) {
Pageable nextPageable = slice.nextPageable();
slice = repository.getUsersByLastName(lastName, nextPageable);
content.addAll(slice.getContent());
}
return content;
}
Spring Boot Starter-Daten: REST
- Von „Azure-spring-data-cosmos“ wird spring-boot-starter-data-rest unterstützt.
- Unterstützt Auflistung und geschachtelten Typ in der Domänenklasse.
- Konfigurierbare ObjectMapper-Beane mit eindeutigem Namen
cosmosObjectMapper
, konfigurieren Sie benutzerdefiniertes ObjectMapper nur, wenn Sie dies wirklich benötigen.
@Bean(name = "cosmosObjectMapper")
public ObjectMapper objectMapper() {
return new ObjectMapper(); // Do configuration to the ObjectMapper if required
}
Überwachung
- Von „Azure-spring-data-cosmos“ wird die Überwachung von Feldern in Datenbankentitäten mithilfe standardmäßiger Spring Data-Anmerkungen unterstützt.
- Zum Aktivieren dieses Features können Sie Ihrer Anwendungskonfiguration eine Anmerkung vom Typ
@EnableCosmosAuditing
hinzufügen. - Entitäten können
@CreatedBy
,@CreatedDate
,@LastModifiedBy
und@LastModifiedDate
verwenden, um Felder mit Anmerkungen zu versehen. Diese Felder werden automatisch aktualisiert.
@Container(containerName = "myContainer")
public class AuditableUser {
private String id;
private String firstName;
@CreatedBy
private String createdBy;
@CreatedDate
private OffsetDateTime createdDate;
@LastModifiedBy
private String lastModifiedBy;
@LastModifiedDate
private OffsetDateTime lastModifiedByDate;
}
Konfiguration mit mehreren Datenbanken
- Von „Azure-spring-data-cosmos“ werden Konfigurationen mit mehreren Datenbanken unterstützt. Das gilt sowohl für mehrere Datenbankkonten als auch für ein einzelnes Konto mit mehreren Datenbanken.
Konten mit mehreren Datenbanken
Im Beispiel wird die Datei application.properties
verwendet.
# primary account cosmos config
azure.cosmos.primary.uri=your-primary-cosmosDb-uri
azure.cosmos.primary.key=your-primary-cosmosDb-key
azure.cosmos.primary.secondaryKey=your-primary-cosmosDb-secondary-key
azure.cosmos.primary.database=your-primary-cosmosDb-dbName
azure.cosmos.primary.populateQueryMetrics=if-populate-query-metrics
# secondary account cosmos config
azure.cosmos.secondary.uri=your-secondary-cosmosDb-uri
azure.cosmos.secondary.key=your-secondary-cosmosDb-key
azure.cosmos.secondary.secondaryKey=your-secondary-cosmosDb-secondary-key
azure.cosmos.secondary.database=your-secondary-cosmosDb-dbName
azure.cosmos.secondary.populateQueryMetrics=if-populate-query-metrics
Die Definition von Entität und Repository ist ähnlich wie oben. Sie können verschiedene Datenbankentitäten in verschiedenen Paketen platzieren.
Durch
@EnableReactiveCosmosRepositories
oder@EnableCosmosRepositories
werden benutzerdefinierte Cosmos-Vorlagen unterstützt. Verwenden SiereactiveCosmosTemplateRef
odercosmosTemplateRef
, um den Namen des BeansReactiveCosmosTemplate
oderCosmosTemplate
zu definieren, das mit den erkannten Repositorys verwendet werden soll.Wenn Sie über mehrere Cosmos-Datenbankkonten verfügen, können Sie mehrere Elemente vom Typ
CosmosAsyncClient
definieren. Verfügt das einzelne Cosmos-Konto über mehrere Datenbanken, können Sie das gleiche Element vom TypCosmosAsyncClient
verwenden, um die Cosmos-Vorlage zu initialisieren.
@Configuration
@EnableReactiveCosmosRepositories(basePackages = "com.azure.spring.sample.cosmos.multi.database.multiple.account.repository",
reactiveCosmosTemplateRef = "primaryDatabaseTemplate")
public class PrimaryDatasourceConfiguration extends AbstractCosmosConfiguration{
private static final String PRIMARY_DATABASE = "primary_database";
@Bean
@ConfigurationProperties(prefix = "azure.cosmos.primary")
public CosmosProperties primary() {
return new CosmosProperties();
}
@Bean
public CosmosClientBuilder primaryClientBuilder(@Qualifier("primary") CosmosProperties primaryProperties) {
return new CosmosClientBuilder()
.key(primaryProperties.getKey())
.endpoint(primaryProperties.getUri());
}
@Bean
public ReactiveCosmosTemplate primaryDatabaseTemplate(CosmosAsyncClient cosmosAsyncClient,
CosmosConfig cosmosConfig,
MappingCosmosConverter mappingCosmosConverter) {
return new ReactiveCosmosTemplate(cosmosAsyncClient, PRIMARY_DATABASE, cosmosConfig, mappingCosmosConverter);
}
@Override
protected String getDatabaseName() {
return PRIMARY_DATABASE;
}
}
@Configuration
@EnableCosmosRepositories(cosmosTemplateRef = "secondaryDatabaseTemplate")
public class SecondaryDatasourceConfiguration {
private static final Logger LOGGER = LoggerFactory.getLogger(SecondaryDatasourceConfiguration.class);
public static final String SECONDARY_DATABASE = "secondary_database";
@Bean
@ConfigurationProperties(prefix = "azure.cosmos.secondary")
public CosmosProperties secondary() {
return new CosmosProperties();
}
@Bean("secondaryCosmosClient")
public CosmosAsyncClient getCosmosAsyncClient(@Qualifier("secondary") CosmosProperties secondaryProperties) {
return CosmosFactory.createCosmosAsyncClient(new CosmosClientBuilder()
.key(secondaryProperties.getKey())
.endpoint(secondaryProperties.getUri()));
}
@Bean("secondaryCosmosConfig")
public CosmosConfig getCosmosConfig() {
return CosmosConfig.builder()
.enableQueryMetrics(true)
.maxDegreeOfParallelism(0)
.maxBufferedItemCount(0)
.responseContinuationTokenLimitInKb(0)
.responseDiagnosticsProcessor(new ResponseDiagnosticsProcessorImplementation())
.build();
}
@Bean
public CosmosTemplate secondaryDatabaseTemplate(@Qualifier("secondaryCosmosClient") CosmosAsyncClient client,
@Qualifier("secondaryCosmosConfig") CosmosConfig cosmosConfig,
MappingCosmosConverter mappingCosmosConverter) {
return new CosmosTemplate(client, SECONDARY_DATABASE, cosmosConfig, mappingCosmosConverter);
}
private static class ResponseDiagnosticsProcessorImplementation implements ResponseDiagnosticsProcessor {
@Override
public void processResponseDiagnostics(@Nullable ResponseDiagnostics responseDiagnostics) {
LOGGER.info("Response Diagnostics {}", responseDiagnostics);
}
}
}
- Im obigen Beispiel sind zwei Cosmos-Konten vorhanden.
CosmosAsyncClient
kann wie folgt erstellt werden:
@Bean("secondaryCosmosClient")
public CosmosAsyncClient getCosmosAsyncClient(@Qualifier("secondary") CosmosProperties secondaryProperties) {
return CosmosFactory.createCosmosAsyncClient(new CosmosClientBuilder()
.key(secondaryProperties.getKey())
.endpoint(secondaryProperties.getUri()));
}
@Bean("secondaryCosmosConfig")
public CosmosConfig getCosmosConfig() {
return CosmosConfig.builder()
.enableQueryMetrics(true)
.maxDegreeOfParallelism(0)
.maxBufferedItemCount(0)
.responseContinuationTokenLimitInKb(0)
.responseDiagnosticsProcessor(new ResponseDiagnosticsProcessorImplementation())
.build();
}
- Wenn Sie außerdem , ,
ResponseDiagnosticsProcessor
maxDegreeOfParallelism
odermaxBufferedItemCount
responseContinuationTokenLimitInKb
definierenqueryMetricsEnabled
möchten, können Sie dieCosmosConfig
Vorlage für Ihre Cosmos erstellen.
@Bean("secondaryCosmosConfig")
public CosmosConfig getCosmosConfig() {
return CosmosConfig.builder()
.enableQueryMetrics(true)
.maxDegreeOfParallelism(0)
.maxBufferedItemCount(0)
.responseContinuationTokenLimitInKb(0)
.responseDiagnosticsProcessor(new ResponseDiagnosticsProcessorImplementation())
.build();
}
- Erstellen einer Anwendungsklasse
@SpringBootApplication
public class MultiDatabaseApplication implements CommandLineRunner {
@Autowired
private CosmosUserRepository cosmosUserRepository;
@Autowired
private MysqlUserRepository mysqlUserRepository;
@Autowired
@Qualifier("secondaryDatabaseTemplate")
private CosmosTemplate secondaryDatabaseTemplate;
@Autowired
@Qualifier("primaryDatabaseTemplate")
private ReactiveCosmosTemplate primaryDatabaseTemplate;
private final CosmosUser cosmosUser = new CosmosUser("1024", "1024@geek.com", "1k", "Mars");
private static CosmosEntityInformation<CosmosUser, String> userInfo = new CosmosEntityInformation<>(CosmosUser.class);
public static void main(String[] args) {
SpringApplication.run(MultiDatabaseApplication.class, args);
}
public void run(String... var1) throws Exception {
CosmosUser cosmosUserGet = primaryDatabaseTemplate.findById(cosmosUser.getId(), cosmosUser.getClass()).block();
// Same to this.cosmosUserRepository.findById(cosmosUser.getId()).block();
MysqlUser mysqlUser = new MysqlUser(cosmosUserGet.getId(), cosmosUserGet.getEmail(), cosmosUserGet.getName(), cosmosUserGet.getAddress());
mysqlUserRepository.save(mysqlUser);
mysqlUserRepository.findAll().forEach(System.out::println);
CosmosUser secondaryCosmosUserGet = secondaryDatabaseTemplate.findById(CosmosUser.class.getSimpleName(), cosmosUser.getId(), CosmosUser.class);
System.out.println(secondaryCosmosUserGet);
}
@PostConstruct
public void setup() {
primaryDatabaseTemplate.createContainerIfNotExists(userInfo).block();
primaryDatabaseTemplate.insert(CosmosUser.class.getSimpleName(), cosmosUser, new PartitionKey(cosmosUser.getName())).block();
// Same to this.cosmosUserRepository.save(user).block();
secondaryDatabaseTemplate.createContainerIfNotExists(userInfo);
secondaryDatabaseTemplate.insert(CosmosUser.class.getSimpleName(), cosmosUser, new PartitionKey(cosmosUser.getName()));
}
@PreDestroy
public void cleanup() {
primaryDatabaseTemplate.deleteAll(CosmosUser.class.getSimpleName(), CosmosUser.class).block();
// Same to this.cosmosUserRepository.deleteAll().block();
secondaryDatabaseTemplate.deleteAll(CosmosUser.class.getSimpleName() , CosmosUser.class);
mysqlUserRepository.deleteAll();
}
}
Einzelnes Konto mit mehreren Datenbanken
Im Beispiel wird die Datei application.properties
verwendet.
azure.cosmos.uri=your-cosmosDb-uri
azure.cosmos.key=your-cosmosDb-key
azure.cosmos.secondary-key=your-cosmosDb-secondary-key
azure.cosmos.database=your-cosmosDb-dbName
azure.cosmos.populate-query-metrics=if-populate-query-metrics
- Die Definition von Entität und Repository ist ähnlich wie oben. Sie können verschiedene Datenbankentitäten in verschiedenen Paketen platzieren.
- Sie können
EnableReactiveCosmosRepositories
mit unterschiedlichen Elementen vom TypreactiveCosmosTemplateRef
verwenden, um mehrere Datenbanken in einem einzelnen Cosmos-Konto zu definieren.
@Configuration
public class DatasourceConfiguration {
private static final String DATABASE1 = "database1";
private static final String DATABASE2 = "database2";
@Bean
public CosmosProperties cosmosProperties() {
return new CosmosProperties();
}
@Bean
public CosmosClientBuilder primaryClientBuilder(CosmosProperties cosmosProperties) {
return new CosmosClientBuilder()
.key(cosmosProperties.getKey())
.endpoint(cosmosProperties.getUri());
}
@EnableReactiveCosmosRepositories(basePackages = "com.azure.spring.sample.cosmos.multi.database.repository1",
reactiveCosmosTemplateRef = "database1Template")
public class Database1Configuration extends AbstractCosmosConfiguration {
@Bean
public ReactiveCosmosTemplate database1Template(CosmosAsyncClient cosmosAsyncClient,
CosmosConfig cosmosConfig,
MappingCosmosConverter mappingCosmosConverter) {
return new ReactiveCosmosTemplate(cosmosAsyncClient, DATABASE1, cosmosConfig, mappingCosmosConverter);
}
@Override
protected String getDatabaseName() {
return DATABASE1;
}
}
@EnableReactiveCosmosRepositories(basePackages = "com.azure.spring.sample.cosmos.multi.database.repository2",
reactiveCosmosTemplateRef = "database2Template")
public class Database2Configuration {
@Bean
public ReactiveCosmosTemplate database2Template(CosmosAsyncClient cosmosAsyncClient,
CosmosConfig cosmosConfig,
MappingCosmosConverter mappingCosmosConverter) {
return new ReactiveCosmosTemplate(cosmosAsyncClient, DATABASE2, cosmosConfig, mappingCosmosConverter);
}
}
}
- Erstellen einer Anwendungsklasse
@SpringBootApplication
public class MultiDatabaseApplication implements CommandLineRunner {
@Autowired
private User1Repository user1Repository;
@Autowired
@Qualifier("database1Template")
private ReactiveCosmosTemplate database1Template;
@Autowired
@Qualifier("database2Template")
private ReactiveCosmosTemplate database2Template;
private final User1 user1 = new User1("1024", "1024@geek.com", "1k", "Mars");
private static CosmosEntityInformation<User1, String> user1Info = new CosmosEntityInformation<>(User1.class);
private final User2 user2 = new User2("2048", "2048@geek.com", "2k", "Mars");
private static CosmosEntityInformation<User2, String> user2Info = new CosmosEntityInformation<>(User2.class);
public static void main(String[] args) {
SpringApplication.run(MultiDatabaseApplication.class, args);
}
public void run(String... var1) throws Exception {
User1 database1UserGet = database1Template.findById(User1.class.getSimpleName(), user1.getId(), User1.class).block();
// Same to userRepository1.findById(user.getId()).block()
System.out.println(database1UserGet);
User2 database2UserGet = database2Template.findById(User2.class.getSimpleName(), user2.getId(), User2.class).block();
System.out.println(database2UserGet);
}
@PostConstruct
public void setup() {
database1Template.createContainerIfNotExists(user1Info).block();
database1Template.insert(User1.class.getSimpleName(), user1, new PartitionKey(user1.getName())).block();
// Same to this.userRepository1.save(user).block();
database2Template.createContainerIfNotExists(user2Info).block();
database2Template.insert(User2.class.getSimpleName(), user2, new PartitionKey(user2.getName())).block();
}
@PreDestroy
public void cleanup() {
database1Template.deleteAll(User1.class.getSimpleName(), User1.class).block();
// Same to this.userRepository1.deleteAll().block();
database2Template.deleteAll(User2.class.getSimpleName(), User2.class).block();
}
}
Mehrinstanzenfähigkeit auf Datenbankebene
- Azure-spring-data-cosmos unterstützt die Mehrinstanzenfähigkeit auf Datenbankebene, indem die GetDatabaseName()-Funktion erweitert
CosmosFactory
und überschrieben wird.
public class MultiTenantDBCosmosFactory extends CosmosFactory {
private String tenantId;
/**
* Validate config and initialization
*
* @param cosmosAsyncClient cosmosAsyncClient
* @param databaseName databaseName
*/
public MultiTenantDBCosmosFactory(CosmosAsyncClient cosmosAsyncClient, String databaseName) {
super(cosmosAsyncClient, databaseName);
this.tenantId = databaseName;
}
@Override
public String getDatabaseName() {
return this.getCosmosAsyncClient().getDatabase(this.tenantId).toString();
}
}
Betaversionspaket
Eine auf der Grundlage des Branchs main
erstellte Betaversion ist verfügbar. Informationen zur Verwendung von Betaversionspaketen finden Sie in dieser Anleitung.
Problembehandlung
Allgemein
Wenn ein Fehler auftreten sollte, melden Sie hier ein Problem.
Wenn Sie ein neues Feature oder Änderungen vorschlagen möchten, die vorgenommen werden könnten, melden Sie ein Problem auf die gleiche Weise wie bei einem Fehler.
Aktivieren der Clientprotokollierung
- Von „Azure-spring-data-cosmos“ wird SLF4j als Protokollierungsfassade verwendet, die die Protokollierung in gängigen Protokollierungsframeworks wie log4j und logback unterstützt. Wenn Sie beispielsweise logback in Spring als Protokollierungsframework verwenden möchten, fügen Sie dem Ressourcenordner den folgenden XML-Code hinzu:
<configuration>
<include resource="/org/springframework/boot/logging/logback/base.xml"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT"/>
</root>
<logger name="com.azure.cosmos" level="error"/>
<logger name="org.springframework" level="error"/>
<logger name="io.netty" level="error"/>
<!-- This will enable query logging, to include query parameter logging, set this logger to TRACE -->
<logger name="com.azure.cosmos.implementation.SqlQuerySpecLogger" level="DEBUG"/>
</configuration>
Beispiele
- Ein Beispielprojekt finden Sie hier.
Konten mit mehreren Datenbanken
- Weitere Informationen finden Sie im Beispielprojekt für mehrere Datenbanken.
Einzelnes Konto mit mehreren Datenbanken
- Weitere Informationen finden Sie im Beispielprojekt für ein einzelnes Konto mit mehreren Datenbanken.
Nächste Schritte
- Weitere Informationen zu Azure Spring Data Cosmos finden Sie hier.
- Weitere Informationen zum Azure CosmosDB-Dienst finden Sie hier.
Mitwirken
Beiträge und Vorschläge für dieses Projekt sind willkommen. Für die meisten Beiträge ist die Zustimmung zu einer Lizenzvereinbarung für Mitwirkende (Contributor License Agreement, CLA) erforderlich, in der Sie erklären, dass Sie dazu berechtigt sind, uns die Rechte für die Nutzung Ihres Beitrags zu erteilen, und dies auch tun.
Wenn Sie einen Pull Request (PR) übermitteln, überprüft ein CLA-Bot automatisch, ob Sie eine Lizenzvereinbarung bereitstellen und den PR entsprechend ergänzen müssen (z.B. mit einer Bezeichnung oder einem Kommentar). Führen Sie einfach die Anweisungen des Bots aus. Sie müssen dies nur einmal für alle Repositorys ausführen, die unsere CLA verwenden.
Für dieses Projekt gelten die Microsoft-Verhaltensregeln für Open Source (Microsoft Open Source Code of Conduct). Weitere Informationen finden Sie in den häufig gestellten Fragen zum Verhaltenskodex. Sie können sich auch an opencode@microsoft.com wenden, wenn Sie weitere Fragen oder Anmerkungen haben.