Использование общего SQL соединения с сервером между всеми потоками и одновременное использование - PullRequest
0 голосов
/ 04 апреля 2020

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

Я создаю класс stati c для подключения к SQL Базе данных сервера с ADO. NET:

public static class ADOFire
{
    static System.Data.SqlClient.SqlConnection Cnn = new System.Data.SqlClient.SqlConnection();

    public static string CnnString { get; set; }

    public static void CreateConnection()
    {
        if (Cnn.State == ConnectionState.Open)
            return;

        Cnn.ConnectionString = CnnString = ConfigurationManager.ConnectionStrings["CnnString"].ToString();

        if (Cnn.State != System.Data.ConnectionState.Open) 
            Cnn.Open();
    }

    public static System.Data.DataTable GetTable(System.Data.SqlClient.SqlCommand Com, System.Data.SqlClient.SqlDataAdapter Ada, string ComText)
    {
        CreateConnection();
        Com.Connection = Cnn;
        Ada.SelectCommand = Com;

        try
        {
            System.Data.DataTable T = new System.Data.DataTable();
            Com.CommandText = ComText;
            Ada.Fill(T);
            return T;
        }
        catch { return null; }
    }
}

И здесь в каждой теме я называю функцию stati c следующим образом:

System.Data.SqlClient.SqlCommand Com = new System.Data.SqlClient.SqlCommand();
System.Data.SqlClient.SqlDataAdapter Ada = new System.Data.SqlClient.SqlDataAdapter();
Datatable dt =  ADOFire.GetTable(Com, Ada, "Some Query 'select * from x'");

На основе эта ссылка , не имеет большого значения для открытия нового соединения или использования из существующего соединения

Каждый раз, когда пользователь вызывает Open для соединения, диспетчер ищет доступное соединение в пуле. Если пул соединения доступен, он возвращает его вызывающей стороне, а не открывает новое соединение. Когда приложение вызывает Close для соединения, диспетчер возвращает его в объединенный набор активных соединений, а не закрывает его. Как только соединение возвращается в пул, оно готово для повторного использования при следующем вызове Open

Мои вопросы:

  1. Может ли соединение обслуживать другое темы одновременно? (одно соединение для всех)

  2. Не проблема беспорядка данных из-за функции stati c?

1 Ответ

1 голос
/ 04 апреля 2020
  1. Нет, ADO. NET не позволяет двум потокам одновременно обращаться к одному и тому же соединению
  2. Да, но проблема не в методе statix, а в том, что * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}}}} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * *} * * * * * *; и вернуть соединение вызывающей стороне, и полностью удалить поле. Типичное использование:
    using (var conn = CreateConnection()) {
       //... Use it!
    }
    

    У меня также есть серьезные опасения по поводу: - почему вы передаете команду и текст команды и адаптер - отсутствие параметров ; предлагает огромную проблему безопасности (SQL внедрение) - использование таблицы данных (которая почти никогда не является наиболее подходящим инструментом)

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