Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Data CosmosDB多租户CosmosDB配置_Java_Azure_Spring Data Jpa_Azure Cosmosdb_Azure Cosmosdb Sqlapi - Fatal编程技术网

Java Spring Data CosmosDB多租户CosmosDB配置

Java Spring Data CosmosDB多租户CosmosDB配置,java,azure,spring-data-jpa,azure-cosmosdb,azure-cosmosdb-sqlapi,Java,Azure,Spring Data Jpa,Azure Cosmosdb,Azure Cosmosdb Sqlapi,我正在多租户应用程序中使用CosmosDB。每个租户都有一个单独的数据库,每个租户的集合都在他们自己的数据库中 考虑到我的应用程序必须处理多个租户,我不能为我的存储库配置一个预定义的数据库。必须根据请求上下文(租户)动态配置数据库。如何使用Spring Data CosmosDB实现这样的设置 下面是如何设置存储库配置的。如您所见,这通过应用程序属性修复了数据库。在真实场景中,应用程序具有来自不同租户的请求;因此必须使用不同的数据库 @Configuration @EnableCosmosRep

我正在多租户应用程序中使用CosmosDB。每个租户都有一个单独的数据库,每个租户的集合都在他们自己的数据库中

考虑到我的应用程序必须处理多个租户,我不能为我的存储库配置一个预定义的数据库。必须根据请求上下文(租户)动态配置数据库。如何使用Spring Data CosmosDB实现这样的设置

下面是如何设置存储库配置的。如您所见,这通过应用程序属性修复了数据库。在真实场景中,应用程序具有来自不同租户的请求;因此必须使用不同的数据库

@Configuration
@EnableCosmosRepositories
@Slf4j
public class UserRepositoryConfiguration extends AbstractCosmosConfiguration {

  @Autowired
  private CosmosDBProperties properties;

  private CosmosKeyCredential cosmosKeyCredential;

      @Bean
      @Primary
      public CosmosDBConfig cosmosDbConfig() {
        this.cosmosKeyCredential = new CosmosKeyCredential(properties.getKey());
        CosmosDBConfig cosmosDBConfig = CosmosDBConfig.builder(properties.getUri(), cosmosKeyCredential,
            properties.getDatabase()).build();
        cosmosDBConfig.setPopulateQueryMetrics(properties.isPopulateQueryMetrics());
        cosmosDBConfig.setResponseDiagnosticsProcessor(new ResponseDiagnosticsProcessorImplementation());
        return cosmosDBConfig;
      }

      public void switchToPrimaryKey() {
        this.cosmosKeyCredential.key(properties.getKey());
      }

      public void switchKey(String key) {
        this.cosmosKeyCredential.key(key);
      }

      private static class ResponseDiagnosticsProcessorImplementation implements ResponseDiagnosticsProcessor {

        @Override
        public void processResponseDiagnostics(@Nullable ResponseDiagnostics responseDiagnostics) {
          log.info("Response Diagnostics {}", responseDiagnostics);
        }
      }
    }

我把我的.net代码放在这里作为参考,它将帮助您编写spring代码

您必须创建一个数据库帐户并需要密钥(
DatabaseEndPoint
&
DatabaseKey
)。然后,您可以根据租户动态创建所有内容,即数据库、集合等

在.net中,我使用依赖注入来注入
IDocumentClient
。下面是我的配置

string databaseEndPoint = ConfigurationManager.AppSettings["DatabaseEndPoint"]; //Get from config file
string databaseKey = ConfigurationManager.AppSettings["DatabaseKey"];//Get from config file
services.AddSingleton<IDocumentClient>(new DocumentClient(new System.Uri(databaseEndPoint), databaseKey,
            new ConnectionPolicy
            {
                ConnectionMode = ConnectionMode.Direct,
                ConnectionProtocol = Protocol.Tcp,
                RequestTimeout = TimeSpan.FromMinutes(5),//Groupasset sync has some timeout issue with large payload
                // Customize retry options for Throttled requests
                RetryOptions = new RetryOptions()
                {
                    MaxRetryAttemptsOnThrottledRequests = 5,
                    MaxRetryWaitTimeInSeconds = 60
                }
            }
        ));
string databaseEndPoint=ConfigurationManager.AppSettings[“databaseEndPoint”]//从配置文件获取
字符串databaseKey=ConfigurationManager.AppSettings[“databaseKey”]//从配置文件获取
AddSingleton(新的DocumentClient(新的System.Uri(databaseEndPoint)),databaseKey,
新连接策略
{
ConnectionMode=ConnectionMode.Direct,
ConnectionProtocol=Protocol.Tcp,
RequestTimeout=TimeSpan.FromMinutes(5),//Groupasset sync在负载较大时存在超时问题
//自定义受限制请求的重试选项
RetryOptions=新的RetryOptions()
{
MaxRetryAttemptsOnThrottledRequests=5,
MaxRetryWaitTimeInSeconds=60
}
}
));
BaseDAO/BaseRepository

public abstract class BaseDao : IBaseDao
{
    protected readonly IDocumentClient client;

    protected BaseDao(IDocumentClient client)
    {
        this.client = client;
    }

    /// <summary>
    /// Create Document in Database
    /// </summary>
    /// <param name="databaseId">database name</param>
    /// <param name="collectionId">collection name</param>
    /// <param name="document">document object</param>
    /// <returns></returns>
    public virtual async Task<string> CreateAsync(string databaseId, string collectionId, JObject document)
    {
        Document response = await client.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(databaseId, collectionId), document);
        return response.Id;
    }
}
公共抽象类BaseDao:ibaseado
{
受保护的只读IDocumentClient客户端;
受保护的BaseDao(IDocumentClient客户端)
{
this.client=client;
}
/// 
///在数据库中创建文档
/// 
///数据库名称
///集合名称
///文档对象
/// 
公共虚拟异步任务CreateAsync(字符串数据库ID、字符串集合ID、JObject文档)
{
Document response=wait client.createdocumentsync(UriFactory.CreateDocumentCollectionUri(databaseId,collectionId),Document);
返回response.Id;
}
}
创建DAO/存储库类并从基本DAO继承


在我的场景中,我们基于
租户
名称创建数据库,即基于用户的google、microsoft等(bill@microsoft.com)所有查询都在一个(microsoft)数据库下执行。

我将.net代码放在这里作为参考,它将帮助您编写spring代码

您必须创建一个数据库帐户并需要密钥(
DatabaseEndPoint
&
DatabaseKey
)。然后,您可以根据租户动态创建所有内容,即数据库、集合等

在.net中,我使用依赖注入来注入
IDocumentClient
。下面是我的配置

string databaseEndPoint = ConfigurationManager.AppSettings["DatabaseEndPoint"]; //Get from config file
string databaseKey = ConfigurationManager.AppSettings["DatabaseKey"];//Get from config file
services.AddSingleton<IDocumentClient>(new DocumentClient(new System.Uri(databaseEndPoint), databaseKey,
            new ConnectionPolicy
            {
                ConnectionMode = ConnectionMode.Direct,
                ConnectionProtocol = Protocol.Tcp,
                RequestTimeout = TimeSpan.FromMinutes(5),//Groupasset sync has some timeout issue with large payload
                // Customize retry options for Throttled requests
                RetryOptions = new RetryOptions()
                {
                    MaxRetryAttemptsOnThrottledRequests = 5,
                    MaxRetryWaitTimeInSeconds = 60
                }
            }
        ));
string databaseEndPoint=ConfigurationManager.AppSettings[“databaseEndPoint”]//从配置文件获取
字符串databaseKey=ConfigurationManager.AppSettings[“databaseKey”]//从配置文件获取
AddSingleton(新的DocumentClient(新的System.Uri(databaseEndPoint)),databaseKey,
新连接策略
{
ConnectionMode=ConnectionMode.Direct,
ConnectionProtocol=Protocol.Tcp,
RequestTimeout=TimeSpan.FromMinutes(5),//Groupasset sync在负载较大时存在超时问题
//自定义受限制请求的重试选项
RetryOptions=新的RetryOptions()
{
MaxRetryAttemptsOnThrottledRequests=5,
MaxRetryWaitTimeInSeconds=60
}
}
));
BaseDAO/BaseRepository

public abstract class BaseDao : IBaseDao
{
    protected readonly IDocumentClient client;

    protected BaseDao(IDocumentClient client)
    {
        this.client = client;
    }

    /// <summary>
    /// Create Document in Database
    /// </summary>
    /// <param name="databaseId">database name</param>
    /// <param name="collectionId">collection name</param>
    /// <param name="document">document object</param>
    /// <returns></returns>
    public virtual async Task<string> CreateAsync(string databaseId, string collectionId, JObject document)
    {
        Document response = await client.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(databaseId, collectionId), document);
        return response.Id;
    }
}
公共抽象类BaseDao:ibaseado
{
受保护的只读IDocumentClient客户端;
受保护的BaseDao(IDocumentClient客户端)
{
this.client=client;
}
/// 
///在数据库中创建文档
/// 
///数据库名称
///集合名称
///文档对象
/// 
公共虚拟异步任务CreateAsync(字符串数据库ID、字符串集合ID、JObject文档)
{
Document response=wait client.createdocumentsync(UriFactory.CreateDocumentCollectionUri(databaseId,collectionId),Document);
返回response.Id;
}
}
创建DAO/存储库类并从基本DAO继承


在我的场景中,我们基于
租户
名称创建数据库,即基于用户的google、microsoft等(bill@microsoft.com)所有查询都在一个(microsoft)数据库下执行。

Hi Pankaj。我实际上使用的是spring数据cosmosdb库。如果我直接使用DocumentClient,就有可能实现某种形式的多租户;嗨,潘卡吉。我实际上使用的是spring数据cosmosdb库。如果我直接使用DocumentClient,就有可能实现某种形式的多租户;