在 Asp.net 核心启动时创建的 SQL 分布式缓存

Posted

技术标签:

【中文标题】在 Asp.net 核心启动时创建的 SQL 分布式缓存【英文标题】:SQL distributed cache created on Asp.net core startup 【发布时间】:2019-04-24 04:24:53 【问题描述】:

我想知道是否有办法在 ASP.NET Core 2.1 应用程序启动时创建 SQL 分布式缓存。

我知道我可以运行这个命令 dotnet sql-cache create <connection string> <schema> <table name> 但这是一个手动过程。我想在启动时自动执行此过程。

这可能吗?

谢谢

【问题讨论】:

startup 我猜你的意思是during deployment?没有理由每次网站启动时都创建缓存,它应该已经存在。为什么不使用用于其他数据库的 same 部署技术?如果缓存表与应用程序的表存储在同一个数据库中,您只需将其包含在部署脚本中 【参考方案1】:

这里有两个选项:

选项1

由于我们可以运行命令来创建表,我们可以从Process 的代码中运行命令。

    public static IServiceCollection ConfigureSqlCacheFromCommand(this IServiceCollection services)
    
        var options = services.BuildServiceProvider().GetRequiredService<IOptions<SqlServerCacheOptions>>();

        var process = new Process()
        
            StartInfo = new ProcessStartInfo
            
                FileName = "cmd.exe",
                Arguments = $"/c dotnet sql-cache create \"options.Value.ConnectionString\"  options.Value.SchemaName   options.Value.TableName ",
                RedirectStandardOutput = true,
                UseShellExecute = false,
                CreateNoWindow = false,
                WindowStyle = ProcessWindowStyle.Normal,
                RedirectStandardInput = true,
                RedirectStandardError = true
            
        ;
        process.Start();
        string input = process.StandardError.ReadToEnd();
        string result = process.StandardOutput.ReadToEnd();
        process.WaitForExit();
        return services;
    

选项2

对于dotnet sql-cache 命令,它也调用dotnet-sql-cache,您可以实现代码以编程方式创建表。

        private static int CreateTableAndIndexes(SqlServerCacheOptions options)
    
        using (var connection = new SqlConnection(options.ConnectionString))
        
            connection.Open();

            var sqlQueries = new SqlQueries(options.SchemaName, options.TableName);
            var command = new SqlCommand(sqlQueries.TableInfo, connection);

            using (var reader = command.ExecuteReader(CommandBehavior.SingleRow))
            
                if (reader.Read())
                
                    return 1;
                
            
            using (var transaction = connection.BeginTransaction())
            
                try
                
                    command = new SqlCommand(sqlQueries.CreateTable, connection, transaction);

                    command.ExecuteNonQuery();

                    command = new SqlCommand(
                        sqlQueries.CreateNonClusteredIndexOnExpirationTime,
                        connection,
                        transaction);

                    command.ExecuteNonQuery();
                    transaction.Commit();
                
                catch (Exception ex)
                
                    transaction.Rollback();
                    return 1;
                
            
        
        return 0;
    

调用CreateTableAndIndexes,可以实现这个扩展方法:

        public static IServiceCollection ConfigureSqlCache(this IServiceCollection services)
    
        var options = services.BuildServiceProvider().GetRequiredService<IOptions<SqlServerCacheOptions>>();
        int result = CreateTableAndIndexes(options.Value);
        return services;
    

用于配置Startup.cs

        services.AddDistributedSqlServerCache(options => 
            options.ConnectionString = @"Server=localhost\MSSQLSERVER01;Database=IISWindows;Trusted_Connection=True;";
            options.TableName = "CacheFromCommand";
            options.SchemaName = "dbo";
        );

        //services.ConfigureSqlCache();
        services.ConfigureSqlCacheFromCommand();

注意

SqlQueries 来自SqlQueries。

安装包Microsoft.Extensions.CommandLineUtils

services.AddDistributedSqlServerCache之后注册ConfigureSqlCache

【讨论】:

对于任何尝试使用第二个选项的人来说,由于 SqlQueries 类是 sql-cache 工具程序的内部(保护级别)类,这不再可能,因此无法再访问它.作为另一种解决方法,您始终可以将该命令作为构建/部署的一部分运行,例如通过您的 csproj 文件。除非我只是误解了如何实现代码/在哪里运行它。【参考方案2】:

您希望如何自动执行此操作?我敢肯定,但有很多方法可以添加分布式缓存。

您可以通过以下链接查看示例:

https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed?view=aspnetcore-2.1

【讨论】:

以上是关于在 Asp.net 核心启动时创建的 SQL 分布式缓存的主要内容,如果未能解决你的问题,请参考以下文章

托管在服务结构上的 ASP.Net 核心项目未启动

为 dotnet core asp.net 运行 CRUD 脚手架时出错

asp.net Web API核心项目启动类里面的SetCompatibilityVersion是啥

asp.net 如何启动sql作业和如何设置作业

docker asp.net 核心容器在 mysql 容器之后启动

奇怪的间歇性 SQL 连接错误,重新启动时修复,3-5 天后恢复 (ASP.NET)