Большая нагрузка при работе с БД

211
12 июня 2018, 20:40

Написал класс для работы с БД от SQL, однако в ходе работы создаётся дочерний процесс от SQL, который нагружает процессор на 20%, и потребляет 170 мб оперативы даже в простое.

Что не так?

static class SQL {
    public class State {
        public State(string name, string lastMessage, int messageCount, int messageLetterCount) {
            this.name = name; this.lastMessage = lastMessage; this.messageCount = messageCount; this.messageLetterCount = messageLetterCount;
        }
        public string name, lastMessage;
        public int messageCount, messageLetterCount;
    }
    static string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\My Documents\Visual Studio 2017\Project\ARRA_bot_GUI\ARRA_bot_GUI\MessageDatabase.mdf;Integrated Security=True";
    public static async Task Insert(string name, string message, string channel) {
        using (var sqlConnection = new SqlConnection(connectionString)) {
            await sqlConnection.OpenAsync();
            if (!await IsCreatedTable(channel)) await createTeble(channel);
            int messageCountNew = 0, messageCountLetterNew = 0;
            SqlCommand command = new SqlCommand($@"update [{channel.ToLower()}]
                                                set 
                                                [LastMessage] = @LastMessage,
                                                [MessageCount] = @MessageCount,
                                                [MessageLetterCount] = @MessageLetterCount
                                                where [Name] = @Name;
                                                if @@rowcount = 0
                                                    insert into [{channel.ToLower()}] (Name, LastMessage, MessageCount, MessageLetterCount)
                                                    values (@Name, @LastMessage, @MessageCount, @MessageLetterCount);", sqlConnection);
            State state = await getState(name, channel);
            if (state != null) {
                messageCountNew += state.messageCount;
                messageCountLetterNew += state.messageLetterCount;
            }
            command.Parameters.AddWithValue("Name", name.ToLower());
            command.Parameters.AddWithValue("LastMessage", message);
            command.Parameters.AddWithValue("MessageCount", messageCountNew + 1);
            command.Parameters.AddWithValue("MessageLetterCount", messageCountLetterNew + message.Length);
            await command.ExecuteNonQueryAsync();
        }
    }
    public static async Task<State> getState(string name, string channel) {
        using (var sqlConnection = new SqlConnection(connectionString)) {
            await sqlConnection.OpenAsync();
            if (!await IsCreatedTable(channel)) return null;
            SqlCommand command = new SqlCommand($"SELECT * FROM [{channel.ToLower()}] WHERE [Name] = @Name", sqlConnection);
            command.Parameters.AddWithValue("Name", name.ToLower());
            using (SqlDataReader dataReader = await command.ExecuteReaderAsync()) {
                State state = null;
                try {
                    dataReader.Read();
                    state = new State(name,
                                      Convert.ToString(dataReader["LastMessage"]),
                                      Convert.ToInt32(dataReader["MessageCount"]),
                                      Convert.ToInt32(dataReader["MessageLetterCount"]));
                } catch (Exception) {
                }
                return state;
            }
        }
    }
    private static async Task<bool> IsCreatedTable(string name) {
        using (var sqlConnection = new SqlConnection(connectionString)) {
            await sqlConnection.OpenAsync();
            SqlCommand command = new SqlCommand($"SELECT count(*)FROM information_schema.TABLES WHERE (TABLE_NAME = '{name.ToLower()}')", sqlConnection);
            var result = await command.ExecuteScalarAsync();
            return (int)result == 1;
        }
    }
    private static async Task createTeble(string channel) {
        using (var sqlConnection = new SqlConnection(connectionString)) {
            await sqlConnection.OpenAsync();
            SqlCommand command = new SqlCommand($@"CREATE TABLE [dbo].[{channel.ToLower()}]
                                            ([Name] NVARCHAR(50) NOT NULL, 
                                            [LastMessage] NVARCHAR(MAX) NOT NULL, 
                                            [MessageCount] INT NOT NULL, 
                                            [MessageLetterCount] INT NOT NULL)", sqlConnection);
            await command.ExecuteNonQueryAsync();
        }
    }
}

Если что, обращаюсь к нему так:

SQL.Insert(q, w, e).GetAwaiter();
SQL.getState(q, w).Result;
READ ALSO
Обновление данных в таблице MySql

Обновление данных в таблице MySql

Помогите разобраться с ошибкой Notice: Undefined index: image в переменной $post_image и $post_image_tmp Что не так?

259
Безопасность через websocket

Безопасность через websocket

В интернете много статей про websocket, какой он быстрый и замечательный, но нигде не нашёл информации как сделать соединение безопасным

283
Вывести данные из БД поменяв местами

Вывести данные из БД поменяв местами

Имеется SQL запрос который отдает:

251
Не записываются задания в лист задач

Не записываются задания в лист задач

есть лист задача на PHP + phpMyAdmin, по коду всё вроде правильно, не выбивает никакой ошибки, но не задания не добавляются в сам лист и БДВот код,...

315