С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
1

Многопоточная работа с MySql. Слишко много соединений

07.04.2014, 17:29. Показов 3819. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
В приложении, которое работает с базой данных MySql имеется функционал по считыванию данных из базы в отдельных потоках. Для mysql.Connection используется один экземпляр соединения. Создается оно один раз со строкой подключения из файла. Часть класса создания соединения с базой
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
        [ThreadStatic]
        private static MySqlConnection curconnection; // текущее подключение
        private static string conStr; 
 
        static MySqlWrapping()
        {
          
                curconnection = Create();
             
        }
 
 
        private static MySqlConnection Create()
        {
          
                    if (curconnection == null)
                    {                                          
                        ReinicialSettings(conStr);
                    }
               
            
            return curconnection;
        }
 
 // переинициализация строки подключения
        public static void ReinicialSettings(string conString)
        {
            conStr = conString;           
            curconnection = new MySqlConnection(conString);
        }
 
 /// <summary>
        /// Текущий экземпляр соединения к базе
        /// </summary>
        public static MySqlConnection CurConnection
        {
            get 
            {
                if (curconnection.State != System.Data.ConnectionState.Open)
                {
 
                    try
                    {
                        curconnection.Open();
                    }
                    catch (Exception)
                    {
 
 
                    }
                }
                return curconnection; 
            }
           
        }
По сути у меня всего один экземпляр соединения на все приложение. Но поскольку есть метка [ThreadStatic] то для каждого потока создается своя копия экземпляра соединения. Проблема в том, что на сервере таких соединений накапливается очень много. И в один прекрасный момент сервер свободные слоты для подключения заканчиваются. Во всех методах 100% все соединения всегда корректно закрываются. Я проверил. Как избежать этого копления экземпляров соединений? Заранее спасибо. Может кто подскажет оптимальную архитектуру даже?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.04.2014, 17:29
Ответы с готовыми решениями:

Тип соединение MYSQL. Превышено максимальное количество соединений
Для работы с БД использую MySQLConnector. Открывается постоянное соединение, которое мне не нужно....

Android 4.1 на HTC One S: используется слишко много памяти
Hi all. Проблема такова: занято слишком много оперативной памяти. Из 1 гигабайта уже при включении...

Excel 2002 выдает ошибку слишко много форматов при форматировании
У меня в Excel 2002 выдает ошибку слишко много форматов при форматировании . Правда файл большой...

Многопоточная запись в бд mysql
Добрый день. Написал скрипты на php которые считывают информацию с коммутаторов, делают некие...

7
1652 / 1151 / 173
Регистрация: 23.07.2010
Сообщений: 6,858
07.04.2014, 21:01 2
Singleton+ThreadStatic - может на 3х-звенку заменить стоит? Клиент дергает сервис, у сервиса - пул соединений?

Не по теме:


Топик интересный, мыслей полет - есть чего пообсуждать, не?;)

0
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
07.04.2014, 21:07  [ТС] 3
pincet, хорошо. возможно и стоит. но вот где гарантия что на mysql не будет висеть множество спящих соединений? и можете подробнее расписать, как вы бы сделали архитектуру приложения?
0
1652 / 1151 / 173
Регистрация: 23.07.2010
Сообщений: 6,858
07.04.2014, 21:51 4
к сожалению, с MySQL знаком слабо, гугл про спящие процессы в основном говорит про неверное закрытие соединений.
Теперь "архитектура"
Если критичен читатель - может, стоит "кластер" соорудить? На серверах(одном сервере с виртуалками) поднять n MySQL, выделить группы запросов (соответственно, физические таблицы размещать на своей ветке кластера+один сервер (если потребуется) для неизвестных на данный момент запросов). Сервис клиенту предоставляет возможность запросить операцию и сам принимает решение - в где брать данные. Вполне серверов с одинаковой структурой может быть больше одного.
Это раз.
Два - что делать с INSERT, UPDATE & DELETE. Та же служба вполне может справиться - вопрос в актуальности данных.
Как-то так. Но это - теория, куски реализовывал, вместе собрать - негде было. Посему - форумчане - давайте будем поделиться опытом
1
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
08.04.2014, 10:38 5
gitarillo, на деле лучше не использовать поле-Connection
следует писать так
C#
1
2
3
4
using(SqlConnection  conn = new SqlConnection("Строка подключения"))
{
//тут используем подключение
}
таким образом соединение будет гарантировано закрыто(на самом деле отправлено в пул подключений). По умолчанию пул подключений удаляется только по завершению приложения (даже если нет ни одного объекта SqlConnection)
1
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
08.04.2014, 10:41  [ТС] 6
Learx, это конечно хорошо. правильно ли я понял что нужно при каждом запросе заново создавать соединение в блоке using? ведь операция создания соединения не маленькая и ресурсопожирающая
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
08.04.2014, 10:44 7
Лучший ответ Сообщение было отмечено gitarillo как решение

Решение

если уж хотите вынести подключение отдельно, то тогда это должно выглядеть как-то так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
static sealed class ConnectionFactory
{
    private string connection = @"строка подключения";//еще лучше создать зашифрованный файл-конфигурацию и брать с него
    public static SqlConnection GetConnection()
    {
           return new SqlConnection(connection);
    }
}
//используем
using( SqlConnection conn = ConnectionFactory.GetConnection())
{
}
Добавлено через 1 минуту
gitarillo, еще раз повторюсь - ADO.NET реализован таким образом, что пул подключений существует независимо от существования объектов SqlConnection - на самом деле в его конструкторе идет сначала обращение к пулу, а при удалении - помещение подключения в пул. заново подключение не будет создаватся
1
755 / 554 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
10.04.2014, 10:32  [ТС] 8
Проверил с использованием using. соединения как висели в спящем состоянии, так и висят. По производительности что мой вариант с синглтоном, что с использованием using примерно одинаков. Проблема использования соединения с базой в многопоточном приложении остается открытой
0
10.04.2014, 10:32
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.04.2014, 10:32
Помогаю со студенческими работами здесь

Как узнать количество доступных соединений к mysql
всем привет)))я хочу узнать количество доступных соединений к бд. я нашел только вот такой запрос...

SQLITE и многопоточная работа
Как организовать работу с SQLITE в многопоточном приложении, т.е. каждый дочерний поток может...

Многопоточная работа программы
К сожалению, не могу сам разобраться с многопоточкой, перепробовал множество путей - отсебятина,...

Многопоточная работа с БД, отправка данных, обновление. Есть ли готовые решения?
Поток &quot;1&quot; читает данные, другие потоки берут из потока &quot;1&quot; и что-то делают. Если по какой-то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru