Распределенный кеш SQL, созданный при запуске ядра Asp.net - PullRequest
0 голосов
/ 21 ноября 2018

Мне было интересно, есть ли способ создать распределенный кеш SQL при запуске приложения ASP.NET Core 2.1.

Я знаю, что могу запустить эту команду dotnet sql-cache create <connection string> <schema> <table name>, но это ручной процесс,Я хочу автоматизировать этот процесс при запуске.

Возможно ли это?

Спасибо

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Вот две опции:

Опции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;
    }

Option2

Для команды 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.

  • Регистрация ConfigureSqlCache после services.AddDistributedSqlServerCache
0 голосов
/ 21 ноября 2018

Как вы хотите автоматизировать это?Я уверен, но есть много способов добавить распределенный кеш.

Примеры можно увидеть по следующей ссылке:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...