我想减少 Azure Cosmos DB SQL-API 的负载,该 API 通过依赖项注入从 .NET Core Web API 调用。
在 App Insights 中,我注意到每次调用 Web API 都会导致对 Cosmos 的 GetDatabase 和 GetCollection 调用,当 Cosmos 负载较重时,这可能需要 5 秒才能运行。
我做了CosmosClient一个单例(例如这里的建议 - https://learn.microsoft.com/en-us/azure/cosmos-db/performance-tips-dotnet-sdk-v3-sql)
然而,我找不到任何关于Database或Container对象是否也可以是单例的建议,因此它们是为每个对 Web API 的请求创建的。
我检查数据库和集合是否存在(例如,遵循此处的建议 - https://learn.microsoft.com/en-us/dotnet/api/microsoft.azure.cosmos.cosmosclient.getdatabase?view=azure-dotnet#备注和https://learn.microsoft.com/en-us/dotnet/api/microsoft.azure.cosmos.cosmosclient.getcontainer?view=azure-dotnet#remarks)
这意味着对于 Web API 的每个请求,都会运行以下代码
var databaseResponse = await this.cosmosClient.CreateDatabaseIfNotExistsAsync(
this.databaseConfiguration.DatabaseName,
throughput: this.databaseConfiguration.DatabaseLevelThroughput);
var database = databaseResponse.Database;
var containerResponse = await database.CreateContainerIfNotExistsAsync(containerId, partitionKey);
var container = containerResponse.Container;
Run Code Online (Sandbox Code Playgroud)
我可以创建单例Database并将Container …
如何使用返回的值securestring或secureObject从链接的 ARM 模板返回的值?
例如,一个子链接模板名为CreateStorage
outputs。例如,在模板输出中返回 SAS:
"outputs": {
"createdContainerSas": {
"type": "string",
"value": "[concat('https://', variables('storageAccountName'), '.blob.core.windows.net/', variables('containerName'), '?', listServiceSas(variables('storageAccountName'), '2018-07-01', variables('importSasInputs')).serviceSasToken)]"
}
}
Run Code Online (Sandbox Code Playgroud)
然后,主模板会将 SAS 密钥添加到 KeyVault,以便应用程序的其余部分可以使用它。主模板获取值如下:
"value": "[reference('CreateStorage').outputs.createdContainerSas.value]"
Run Code Online (Sandbox Code Playgroud)
问题在于,当前返回的 SAS 密钥意味着string它在 Azure 部署 UI 中以纯文本形式显示。
但是,当我将返回对象的类型更改为 orsecurestring时secureObject,然后createdContainerSas.value调用时,会遇到以下错误:
{\r\n \"code\": \"InvalidTemplate\",\r\n \"message\": \"Unable to process template language expressions for resource '/subscriptions/<my-subscription-id>/resourceGroups/<my-resource-group>/providers/Microsoft.Resources/deployments/CreateKeyVault' at line …Run Code Online (Sandbox Code Playgroud) 目标:
返回 Cosmos 集合分区内特定文档字段的不同值的计数。
脚步:
如果我在 Azure Cosmos 数据库上运行以下查询,
SELECT DISTINCT c.field
FROM c
WHERE c.field = 'abc' AND c.partitionKeyField = '123'
Run Code Online (Sandbox Code Playgroud)
我按预期得到一行,例如以下响应
[
{
"field": "abc"
}
]
Run Code Online (Sandbox Code Playgroud)
但是,如果我随后运行以下查询以尝试通过以下查询计算响应中不同文档的数量
[
{
"field": "abc"
}
]
Run Code Online (Sandbox Code Playgroud)
它返回
[
6
]
Run Code Online (Sandbox Code Playgroud)
c.field这是设置为 的文档总数,"abc"而不是 的不同值的数量c.field。
问题:
请您帮助我理解为什么查询返回 的文档数量而不是不同值的数量c.field,以及是否有一个查询将返回 的不同值的数量c.field,即 1?
编辑-PS。我知道这是一个人为的示例,因为根据定义,唯一值的数量c.field始终为 1 - 我故意从实际情况简化了这一点。
我已经为创建 JFileChooser 的 Swing GUI 编写了单元测试。由于单元测试作为服务在构建服务器上运行,因此单元测试需要作为本地系统帐户运行。但是,当单元测试尝试创建新的 JFileChooser 时,它们会抛出 NullPointerException。
我已将问题简化为将以下主类作为本地系统帐户运行(不是真正的代码)
package com.example.mcgr;
import javax.swing.*;
import java.io.IOException;
public class FileChooserAsSystem {
public static void main(String[] args) throws IOException {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFileChooser fileChooser = new JFileChooser();
fileChooser.showDialog(null, "Ok");
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
使用以下构建文件。
<project>
<target name="clean">
<delete dir="build"/>
</target>
<target name="compile" depends="clean">
<mkdir dir="build/classes"/>
<javac srcdir="src" destdir="build/classes"/>
</target>
<target name="jar" depends="compile">
<mkdir dir="build/jar"/>
<jar destfile="build/jar/FileChooserAsSystem.jar" basedir="build/classes">
<manifest>
<attribute name="Main-Class" value="com.example.mcgr.FileChooserAsSystem"/>
</manifest>
</jar>
</target>
<target name="run">
<java …Run Code Online (Sandbox Code Playgroud)