Java için Azure Spring Data Cosmos istemci kitaplığı
Azure Spring Data Cosmos, Spring Data çerçevesini temel alan SQL API'sini kullanarak Azure Cosmos DBiçin Spring Data desteği sağlar. Azure Cosmos DB, geliştiricilerin SQL, MongoDB, Cassandra, Graph ve Table gibi çeşitli standart API'leri kullanarak verilerle çalışmasına olanak sağlayan genel olarak dağıtılmış bir veritabanı hizmetidir.
Spring veri sürümü desteği
Bu proje hem hem de spring-data-commons 2.2.x sürümlerini spring-data-commons 2.3.x destekler. Maven kullanıcıları, Spring'in spring-boot-starter-parent bağımlılık sürümlerini yönetmesine izin vermesi için bir bağımlılık yönetimi bölümü elde etmek için projeden devralabilir.
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
</parent>
Bu kurulumla, kendi projenizin bir özelliğini geçersiz kılarak tek tek bağımlılıkları geçersiz kılabilirsiniz. Örneğin, başka bir Spring Data sürüm eğitimini yükseltmek için aşağıdakini uygulamanıza pom.xml.
<properties>
<spring-data-releasetrain.version>${spring.data.version}</spring-data-releasetrain.version>
</properties>
kullanmak istemiyorsanız, yine de bir bağımlılık kullanarak bağımlılık spring-boot-starter-parent yönetiminin avantajını scope=import tutabileceksiniz:
<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>
Bu kurulum, yukarıda açıklanan şekilde bir özelliği kullanarak tek tek bağımlılıkları geçersiz kılmaya izin vermez. Aynı sonucu elde etmek için, girdiden önce projenizin dependencyManagement özelliğine bir giriş eklemeniz spring-boot-dependencies gerekir. Örneğin, başka bir Spring Data sürüm eğitimini yükseltmek için aşağıdakini uygulamanıza pom.xml.
<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>
Not
ve yerine Spring Boot ve Spring Data sürümlerini ${spring.boot.version}${spring.data.version} kullanın.
Başlarken
Paketi dahil etmek
Maven kullanıyorsanız aşağıdaki bağımlılığı ekleyin.
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-spring-data-cosmos</artifactId>
<version>3.13.1</version>
</dependency>
Önkoşullar
- Java Development Kit (JDK), sürüm 8 veya sonrası.
- Etkin bir Azure hesabı. Bir aboneliğiniz yoksa ücretsiz bir hesap için kaydolabilirsiniz. Alternatif olarak Azure Cosmos DB Emulator geliştirme ve test için kullanabilirsiniz. Öykünücü https sertifikası otomatik olarak imzalandı olarak, sertifikasını java trusted cert store'a aktarmanız gerekir, burada açıklanmıştır
- (İsteğe bağlı) SLF4J bir günlük cephesidir.
- (İsteğe bağlı) SLF4J bağlaması, belirli bir günlük çerçevesini SLF4J ile ilişkilendirmek için kullanılır.
- (İsteğe bağlı) Maven
SLF4J yalnızca günlüğü kullanmayı planlıyorsanız gereklidir. Ayrıca SLF4J API'sini istediğiniz günlük uygulamasına bağacak bir SLF4J bağlaması da indirin. Daha fazla bilgi için bkz. SLF4J kullanıcı kılavuzu.
Yapılandırma Sınıfı Kurulumu
Yapılandırma sınıfını ayarlamak için AbstractCosmosConfiguration
Azure-spring-data-cosmos, ve 'i de Response Diagnostics StringQuery Metrics destekler.
Sorgu queryMetricsEnabled ölçümlerini etkinleştirmek için application.properties içinde bayrağını true olarak ayarlayın.
bayrağını ayarlamaya ek olarak tanılama ResponseDiagnosticsProcessor bilgilerini günlüğe almak için de uygulama yapın.
@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;
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);
}
@Override
public CosmosConfig cosmosConfig() {
return CosmosConfig.builder()
.enableQueryMetrics(queryMetricsEnabled)
.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);
}
}
}
Yapılandırmayı Özelleştirme
veya veya her DirectConnectionConfigGatewayConnectionConfig ikisini de özelleştirilebilir ve özelleştirilen CosmosClientBuilder bean'ler sebilirsiniz CosmosAsyncClient
@Bean
public CosmosClientBuilder getCosmosClientBuilder() {
DirectConnectionConfig directConnectionConfig = new DirectConnectionConfig();
GatewayConnectionConfig gatewayConnectionConfig = new GatewayConnectionConfig();
return new CosmosClientBuilder()
.endpoint(uri)
.directMode(directConnectionConfig, gatewayConnectionConfig);
}
@Override
public CosmosConfig cosmosConfig() {
return CosmosConfig.builder()
.enableQueryMetrics(queryMetricsEnabled)
.responseDiagnosticsProcessor(new ResponseDiagnosticsProcessorImplementation())
.build();
}
Varsayılan olarak, @EnableCosmosRepositories Spring Data'nın depo arabirimlerinden birini genişleten tüm arabirimler için geçerli paketi tarar.
Proje düzeninizin birden çok projesi varsa, yapılandırma sınıfınıza ek açıklama ek olarak farklı bir kök @EnableCosmosRepositories(basePackageClass=UserRepository.class) paketi taramak için bunu kullanın.
Varlık tanımlama
Azure Cosmos DB'de basit bir varlığı öğe olarak tanımlayın.
Ek açıklamayı ekleyerek ve kapsayıcı adı, istek birimleri (RU), yaşam süresi ve kapsayıcıyı otomatik oluşturma gibi kapsayıcıyla ilgili özellikleri belirterek varlıkları @Container tanımlayabilirsiniz.
Siz istemedikçe kapsayıcılar otomatik olarak oluşturulur. Kapsayıcıların autoCreateContainer otomatik olarak oluşturulmasını devre dışı bırakmak için ek açıklamada false @Container olarak ayarlayın.
Not
Yeni oluşturulan kapsayıcılara atanan istek birimleri varsayılan olarak 400'tir. SDK tarafından oluşturulan kapsayıcı için istek birimlerini özelleştirmek için farklı ru değeri belirtin (en düşük RU değeri 400'tür).
@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;
}
}
Alanı, id Azure Cosmos DB'de Öğe Kimliği olarak kullanılacaktır. öğe gibi başka bir alan kullanmak firstName için bu alana ek açıklama id@Id eklemeniz gerekir.
Ek @Container(containerName="myContainer") açıklama, Azure Cosmos DB'de kapsayıcı adını belirtir.
alan ek @PartitionKeylastName açıklaması, bu alanı Azure Veritabanı'nın bölüm anahtarı Cosmos belirtir.
Otomatik ölçeklendirme aktarım hızına sahip Kapsayıcılar oluşturma
Ek açıklama autoScale alanı, true olarak ayarlanırsa otomatik ölçeklendirme aktarım hızıyla oluşturulacak kapsayıcıyı belirtir. Varsayılan değer false'tır ve kapsayıcıların el ile aktarım hızıyla oluşturulacakları anlamına gelir.
Otomatik ölçeklendirme aktarım hızı hakkında daha fazla bilgi için buraya tıklayın
@Container(containerName = "myContainer", autoScale = true, ru = "4000")
public class UserSample {
@Id
private String emailAddress;
}
İç İçe Bölüm Anahtarı desteği
Spring Data Cosmos SDK'sı iç içe bölüm anahtarını destekler. İç içe bölüm anahtarı eklemek için ek açıklama partitionKeyPath alanında alanını @Container kullanın.
partitionKeyPath yalnızca iç içe bölüm anahtarı yolunu desteklemek için kullanılmalıdır. Genel bölüm anahtarı desteği için ek açıklamasını @PartitionKey kullanın.
@PartitionKeyBelirtilmezse, varsayılan olarak ek açıklama önceliklidir.
Aşağıdaki örnek, İç İçe Bölüm anahtarı özelliğinin nasıl düzgün bir şekilde kullanılagelmiş olduğunu gösterir.
@Container(containerName = "nested-partition-key", partitionKeyPath = "/nestedEntitySample/nestedPartitionKey")
public class NestedPartitionKeyEntitySample {
private NestedEntitySample nestedEntitySample;
}
public class NestedEntitySample {
private String nestedPartitionKey;
}
Depo oluşturma
Spring Data deposu desteği sağlayan CosmosRepository arabirimini genişletir.
@Repository
public interface UserRepository extends CosmosRepository<User, String> {
Iterable<User> findByFirstName(String firstName);
long countByFirstName(String firstName);
User findOne(String id, String lastName);
}
findByFirstNameyöntemi özel sorgu yöntemidir, firstName başına öğe bulur.
QueryAnnotation: Depolarda açıklamalı sorgular kullanma
Azure Spring Data Cosmos, kullanarak depolarda açıklamalı sorgular belirtmeyi @Query destekler.
Zaman uyumlu olarak ek açıklamalı sorgular için bazı örnekler aşağıda CosmosRepository verilmiştir:
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);
}
Burada, içinde açıklamalı sorgular için bazı örnekler ReactiveCosmosRepository verilmiştir.
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);
}
Ek açıklama içinde belirtilen sorgular, ek açıklamalı Cosmos aynıdır. Cosmos'daki sorgular hakkında daha fazla SQL için lütfen aşağıdaki makalelere Cosmos:
Uygulama sınıfı oluşturma
Burada tüm bileşenleriyle bir uygulama sınıfı oluşturun.
@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);
}
}
Kaydetme, UserRepository silme, bulma gibi işlemleri gerçekleştirmek için arabirimi otomatik olarak kablolar.
Spring Data Azure Cosmos DB, bulma , kaydetme yöntemlerinin ardındaki sorguları CosmosTemplateReactiveCosmosTemplateCosmosTemplateReactiveCosmosTemplate kullanır. Şablonu daha karmaşık sorgular için kendiniz kullanabilirsiniz.
Önemli kavramlar
CrudRepository ve ReactiveCrudRepository
Azure Spring Data Cosmos, temel CRUD işlevselliği sağlayan ReactiveCrudRepository ve CrudRepository'u destekler:
- save
- findAll
- id'ye göre findOne
- Deleteall
- kimlikle silme
- varlığı silme
Spring Veri Ek Açıklamaları
- Spring Data @Id ek açıklaması.
Etki alanı sınıfındaki bir alanı Azure Cosmos DB Öğesi alanına eşlemenin 2 yolu vardır: - etki alanı sınıfındaki bir alana ile açıklama ekleme, bu alan Cosmos id@Id DB'de Öğe ile id eşlenmiş olur.
- bu alanın adını olarak ayarlayın. Bu alan Azure Cosmos idid DB'de Item ile eşlenmiş olur.
Uygulama ek açıklamasını kullanarak dize türü UUID'lerin otomatik @GeneratedValue destekler. Eklemeden önce otomatik olarak rastgele bir UUID oluşturmak için, dize türü kimliğine sahip bir varlığın ID alanı @GeneratedValue ile açıklama ek açıklamalı olarak kullanılabilir.
public class GeneratedIdEntity {
@Id
@GeneratedValue
private String id;
}
- SpEL İfadesi ve Özel Kapsayıcı Adı.
- Varsayılan olarak, kapsayıcı adı kullanıcı etki alanı sınıfının sınıf adı olur. Özelleştirmek için alan sınıfına
@Container(containerName="myCustomContainerName")ek açıklamasını ekleyebilirsiniz. Kapsayıcı alanı ayrıca SpEL ifadelerini de destekler (örn.container = "${dynamic.container.name}"veyacontainer = "#{@someBean.getContainerName()}"), kapsayıcı adlarını program aracılığıyla/yapılandırma özellikleri aracılığıyla sağlamak için. - SpEL ifadelerinin düzgün çalışması için Spring Application sınıfının
@DependsOn("expressionResolver")üstüne eklemeniz gerekir.
- Varsayılan olarak, kapsayıcı adı kullanıcı etki alanı sınıfının sınıf adı olur. Özelleştirmek için alan sınıfına
@SpringBootApplication
@DependsOn("expressionResolver")
public class SampleApplication {
}
- Özel IndexingPolicy Varsayılan olarak, IndexingPolicy Azure hizmeti tarafından ayarlanır. Özelleştirmek için,
@CosmosIndexingPolicyetki alanı sınıfına ek açıklama ekleyin. Bu ek açıklamanın özelleştirmek için 4 özniteliği vardır, aşağıdakilere bakın:
// 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 {};
Azure Cosmos DB bölümü
Azure-spring-data-cosmos Azure Cosmos DB bölümünüdestekler.
Bölüm anahtarı alanı olacak şekilde etki alanı sınıfının bir alanını belirtmek için, içine not ekleyin @PartitionKey .
CRUD işlemi gerçekleştirdiğinizde, Bölüm değerini belirtin.
Bölüm CRUD hakkında daha fazla örnek için lütfen buradaki testi inceleyin
İyimser kilitleme
Azure-Spring-Data-Cosmos, belirli kapsayıcılar için Iyimser kilitlemeyi destekler; bu da öğe, öğenin başka bir işlem tarafından aynı sırada değiştirildiği durumda bir özel durumla başarısız olur.
Bir kapsayıcı için Iyimser kilitlemeyi etkinleştirmek üzere yalnızca bir dize alanı oluşturmanız _etag ve ek açıklama ile işaretlemeniz yeterlidir @Version . Aşağıdakilere bakın:
@Container(containerName = "myContainer")
public class MyItem {
String id;
String data;
@Version
String _etag;
}
Yay verileri özel sorgusu, disk belleğine ve sıralama
Azure-Spring-Data-Cosmos, yay verileri özel sorgularınıdestekler, örneğin, gibi bir bulma işlemi
Spring veri sayfalanabilir, dilim ve sıralamayıdestekler. -Veritabanı hesabında kullanılabilir ru 'ya bağlı olarak cosmosDB, istenen boyuttan küçük veya ona eşit olan öğeleri döndürebilir. -Her yinelemede döndürülen öğelerin bu değişken sayısı nedeniyle, Kullanıcı totalPageSize 'a dayanmamalıdır ve bunun yerine disk belleğine almanın bu şekilde yapılması gerekir.
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;
}
Yay önyükleme başlangıç verisi Rest
Azure-Spring-Data-Cosmos, Spring-Boot-Starter-Data-Rest' i destekler.
- , Etki alanı sınıfında liste ve iç içe türü destekler.
- Benzersiz ada sahip yapılandırılabilir ObjectMapper çekirdeklere
cosmosObjectMapper, yalnızca gerçekten ihtiyacınız varsa özelleştirilmiş ObjectMapper 'ı yapılandırın. Örnek:
@Bean(name = "cosmosObjectMapper")
public ObjectMapper objectMapper() {
return new ObjectMapper(); // Do configuration to the ObjectMapper if required
}
Denetim
Azure-Spring-Data-Cosmos, standart yay-veri ek açıklamalarını kullanarak veritabanı varlıklarındaki denetim alanlarını destekler.
Bu özellik, @EnableCosmosAuditing uygulama yapılandırmanıza ek açıklama eklenerek etkinleştirilebilir.
Varlıklar,, ve kullanarak alanlara açıklama ekleyebilir @CreatedBy@CreatedDate@LastModifiedBy@LastModifiedDate . Bu alanlar otomatik olarak güncelleştirilir.
@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;
}
Çoklu veritabanı yapılandırması
Azure-Spring-Data-Cosmos, "birden çok veritabanı hesabı" ve "birden çok veritabanına sahip tek hesap" da dahil olmak üzere birden çok veritabanı yapılandırmasını destekler.
Çoklu veritabanı hesapları
Örnek, Application. Properties dosyasını kullanır:
# 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
Varlık ve Depo tanımı, yukarıdaki gibi benzerdir. Farklı paketlere farklı veritabanı varlıkları yerleştirebilirsiniz.
@EnableReactiveCosmosRepositoriesVeya @EnableCosmosRepositories desteği Kullanıcı-Cosmos şablonunu tanımlama, reactiveCosmosTemplateRefcosmosTemplateRefReactiveCosmosTemplateCosmosTemplate algılanan depolarla kullanılacak veya çekirdeklere adını yapılandırma için veya kullanın.
Birden çok Cosmos veritabanı hesabınız varsa, birden çok tanımlayabilirsiniz CosmosAsyncClient . Tek Cosmos hesabında birden çok veritabanı varsa, CosmosAsyncClient Cosmos şablonunu başlatmak için aynısını kullanabilirsiniz.
@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)
.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);
}
}
}
yukarıdaki örnekte, iki Cosmos hesabı vardır. CosmosAsyncClientŞöyle oluşturabilirsiniz:
@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)
.responseDiagnosticsProcessor(new ResponseDiagnosticsProcessorImplementation())
.build();
}
veya tanımlamak istiyorsanız, queryMetricsEnabledResponseDiagnosticsProcessorCosmosConfig Cosmos şablonunuz için oluşturabilirsiniz.
@Bean("secondaryCosmosConfig")
public CosmosConfig getCosmosConfig() {
return CosmosConfig.builder()
.enableQueryMetrics(true)
.responseDiagnosticsProcessor(new ResponseDiagnosticsProcessorImplementation())
.build();
}
Sınıf oluşturun Application :
@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();
}
}
Çoklu veritabanı içeren tek hesap
Örnek, Application. Properties dosyasını kullanır:
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
Varlık ve Depo tanımı, yukarıdaki gibi benzerdir. Farklı paketlere farklı veritabanı varlıkları yerleştirebilirsiniz.
EnableReactiveCosmosRepositoriesreactiveCosmosTemplateRef Tek Cosmos hesabında birden çok veritabanını tanımlamak için, farklı ile kullanabilirsiniz.
@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);
}
}
}
Sınıf oluşturun Application :
@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();
}
}
Beta sürümü paketi
Daldan yerleşik beta sürümü master kullanılabilir, beta sürümü paketlerini kullanmak için master başvurabilirsiniz.
Sorun giderme
Genel
Herhangi bir hatayla karşılaşırsanız lütfen burayabir sorun bildirin.
Yapılan yeni bir özellik veya değişiklik önermek için bir sorunu hata ile aynı şekilde dosyalayamazsınız.
Istemci günlüğünü etkinleştir
Azure-Spring-Data-Cosmos, Log4J ve logback gibi popüler günlük çerçeveleri içinde oturum açmayı destekleyen oturum açma façlata olarak dolayısıyla slf4j kullanır. Örneğin, Spring logback 'i günlük oluşturma çerçevesi olarak kullanmak istiyorsanız, aşağıdaki xml kaynakları klasörünü ekleyin.
<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>
Örnekler
Lütfen örnek projeyebakın.
Çoklu veritabanı hesapları
Lütfen Çoklu veritabanı örnek projesinebakın.
Çoklu veritabanı içeren tek hesap
Lütfen birden çok veritabanı örnek projesi olan tek bir hesababakın.
Sonraki adımlar
- Azure Spring Data Cosmos hakkında buradandaha fazla bilgi edinin.
- Azure CosmosDB hizmeti hakkında daha fazla bilgi edinin
Katkıda bulunma
Bu proje, katkı ve önerilere açıktır. Çoğu katkı, bir katkıda bulunan lisans sözleşmesi 'ni (CLA) kabul etmenizi ve aslında sizin katkılarınızı kullanma hakkı vermeyi gerektirir.
Bir çekme isteği gönderdiğinizde, CLA robotu bir CLA sağlamanız gerekip gerekmediğini otomatik olarak belirler ve çekme isteğini uygun şekilde donatır (örn. etiket, açıklama). Robot tarafından sağlanan yönergeleri izlemeniz yeterlidir. Bu işlemi, CLA’mızı kullanarak tüm depolarda yalnızca bir kere yapmanız gerekir.
Bu proje Microsoft Open Source Code of Conduct (Microsoft Açık Kaynak Kullanım Kuralları) belgesinde listelenen kurallara uygundur. Daha fazla bilgi için bkz. kullanım KURALLARı SSS veya ek soru veya açıklamalarla iletişim kurma.
