gpt4 book ai didi

c# - 使用c#提高dacpac部署的性能

转载 作者:太空狗 更新时间:2023-10-30 01:30:45 25 4
gpt4 key购买 nike

我们正在部署到 MS SQL Server localdb 进行集成测试。

我们构建一个数据库项目,并复制生成的 dacpac 文件,以便 IntegrationTests 项目使用。到目前为止我们有:

DatabaseProject.sqlproj
bin/debug/DatabaseProject.dacpac
IntegrationTests.csproj
bin/debug/DatabaseProject.dacpac

我们在 IntegrationTests 项目中有一个程序集设置,其中创建了一个新的新数据库并将 dacpac 部署到 localdb。在 TearDown 中,数据库被删除,因此我们有一个确定的测试状态。

这是部署 dacpac 的代码,它使用 DacServices(Microsoft.SqlServer.DacSystem.Data。 SqlLocalDb, System.Data.SqlClient):

public void CreateAndInitializeFromDacpac(
ISqlLocalDbInstance localDbInstance,
string databaseName,
string connectionString,
string dacpacPath)
{

using (var cx = localDbInstance.CreateConnection())
{
cx.Open();
using (var command = new SqlCommand(
string.Format("CREATE DATABASE {0}", databaseName), cx))
command.ExecuteNonQuery();
}

var svc = new DacServices(connectionString);

svc.Deploy(
DacPackage.Load(dacpacPath),
databaseName,
true
);
}

我们现在有几个数据库项目,部署每个项目大约需要 8 秒。这会增加执行测试的总时间。

是否有可能以某种方式提高 dacpac 的部署性能?

最佳答案

加文是对的!

不要拆除数据库,而是使用创建新数据库选项,这样 SSDT 就不必在知道一个模型为空时浪费时间比较两个模型。

部署代码应更改为:

var dacOptions = new DacDeployOptions { 
CreateNewDatabase = true
};

svc.Deploy(
DacPackage.Load(dacpacPath),
databaseName,
true,
options: dacOptions
);

如果您设置此标志,SSDT 可以执行许多其他优化 - 如果您不愿意使用反射器,请查看 Microsoft.Data.Tools.Schema.Sql .dllMicrosoft.Data.Tools.Schema.Sql.Deployment.SqlDeploymentPlanGenerator.OnInitialize(SqlDeployment)。如果设置了该标志,它会跳过整个连接到数据库和从部署的 T-SQL 到模型的逆向工程。

这可能会导致一个潜在的错误,即人们更改模型数据库以包含一些对象,然后使用 SSDT 部署模型数据库中的对象,但就边缘情况而言,这听起来很低!

按照 TheGameiswar 的建议,通过使用 Parallel.Foreach 并行化代码,也可以提高多数据库情况下的性能。

关于c# - 使用c#提高dacpac部署的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43365451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com