Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > постоянное соединение с базой (SQL)


Автор: Sam3000 9.9.2011, 14:05
Как можно реализовать постоянное соединение с базой, не важно какой мУскл или мСскл?
Скачал исходник aocell, эмулятор игрового сервера Anarchy Online, там есть код
Код

    public class MySqlWrapper
    {
        #region MySql Setup...
        /// <summary>
        /// Opens a Public MySql Datareader named 'myreader' to be used in any class that has AO.Core in the using
        /// </summary>
        public MySqlDataReader myreader;
        /// <summary>
        /// Opens a Public Mysql Connection named 'mcc' to be used in any class that has AO.Core in the using
        /// </summary>
        public MySqlConnection mcc;
        /// <summary>
        /// Opens a Public Mysql Command named 'mcom' to be used in any class that has AO.Core in using.
        /// </summary>
        public MySqlCommand mcom;
        #endregion
        #region MySql Read System...
        /// <summary>
        /// Reads SQL Table
        /// </summary>
        /// <param name="SqlQuery">Reads data from SQL DB, SqlQuery =  string SqlQuery = "SELECT * FROM `table` WHERE ID = "+ "'"+charID+"'";</param>
        public void MySqlRead(string SqlQuery)
        {
            //MysqlRead: Create a SqlQuery to send to this wrapper for Reading the DB
           
            mcc = new MySqlConnection(ConfigReadWrite.Instance.CurrentConfig.MysqlConnection);
            mcom = new MySqlCommand(SqlQuery);
            mcom.Connection = mcc;
            mcom.CommandTimeout = 10000;
            mcc.Open();
            myreader = mcom.ExecuteReader();
        }
        #endregion
        #region MySql Update System...
        /// <summary>
        /// Updates Data in SQL Table
        /// </summary>
        /// <param name="SqlQuery">Updates data in SQL DB, SqlQuery = string SqlQuery = "UPDATE `table` SET `collum` = "+data+" WHERE ID = "'"+charID+"'";</param>
        public void MySqlUpdate(string SqlQuery)
        {
            mcc = new MySqlConnection(ConfigReadWrite.Instance.CurrentConfig.MysqlConnection);
            mcom = new MySqlCommand(SqlQuery);
            mcom.Connection = mcc;
            mcom.CommandTimeout = 10000;
            mcc.Open();
            mcom.ExecuteNonQuery();
            mcc.Close();
        }
        #endregion
        #region MySql Insert System...
        /// <summary>
        /// Inserts data to SQL DB
        /// </summary>
        /// <param name="SqlQuery">Insert data into the SQL db, SqlQuery = INSERT INTO `dbname`  VALUES (`item1_value`, `item2_value`, `etc`)  </param>
        public void MySqlInsert(string SqlQuery)
        {
            mcc = new MySqlConnection(ConfigReadWrite.Instance.CurrentConfig.MysqlConnection);
            mcom = new MySqlCommand(SqlQuery);
            mcom.Connection = mcc;
            mcom.CommandTimeout = 10000;
            mcc.Open();
            mcom.ExecuteNonQuery();
            mcc.Close();
        }
        #endregion
        #region MySql Delete System...
        /// <summary>
        /// Deletes data from the SQL Table
        /// </summary>
        /// <param name="SqlQuery">SQL Query to execute DELETE from SQL DB, SqlQuery = DELETE FROM `database` WHERE (`Field` = {value})</param>
        public void MySqlDelete(string SqlQuery)
        {
            mcc = new MySqlConnection(ConfigReadWrite.Instance.CurrentConfig.MysqlConnection);
            mcom = new MySqlCommand(SqlQuery);
            mcom.Connection = mcc;
            mcom.CommandTimeout = 10000;
            mcc.Open();
            mcom.ExecuteNonQuery();
            mcc.Close();
        }
        #endregion
    }

То есть на каждое действие к базе он создаёт новое подключение, а потом закрывает его.
И вообще такой подход актуален?

Если я ничего не путаю, то на си и си++ постоянное подключение реализовано через указатели.

Автор: MasterOfCode 9.9.2011, 14:28
Цитата(Sam3000 @  9.9.2011,  16:05 Найти цитируемый пост)
То есть на каждое действие к базе он создаёт новое подключение, а потом закрывает его.
И вообще такой подход актуален?

Актуален. Открыл соединение, выполнил нужные действия, закрыл соединение чтоб канал не забивал и лишней нагрузку на сервер не было.

Собственно постоянное соединение это то, что находится между строк
Код

mcc = new MySqlConnection(ConfigReadWrite.Instance.CurrentConfig.MysqlConnection);
mcc.Open();
//...
mcc.Close();

Если все же нужно держать соединение открытым постоянно.  То объяви глобальную переменную MySqlConnection, на старт программы открывай соединение (mcc.Open();), на закрытие программы закрывай соединение (mcc.Close();). (Но возможно столкнешься с проблемами)

Автор: Sam3000 9.9.2011, 14:35
Цитата

Актуален. Открыл соединение, выполнил нужные действия, закрыл соединение чтоб канал не забивал и лишней нагрузку на сервер не было.

А на открытие/закрытие соединения не больше будет нагрузки и затрат времени с ресурсами?
Цитата

Собственно постоянное соединение это то, что находится между строк
Код

mcc = new MySqlConnection(ConfigReadWrite.Instance.CurrentConfig.MysqlConnection);
mcc.Open();
//...
mcc.Close();

Если все же нужно держать соединение открытым постоянно.  То объяви глобальную переменную MySqlConnection, на старт программы открывай соединение (mcc.Open();), на закрытие программы закрывай соединение (mcc.Close();). (Но возможно столкнешься с проблемами)

А если у нас класс DB в другом файле и соединение используется в разных местах?

Автор: Экскалупатор 10.9.2011, 09:45
Цитата(Sam3000 @  9.9.2011,  13:35 Найти цитируемый пост)

А на открытие/закрытие соединения не больше будет нагрузки и затрат времени с ресурсами?


почитай про пул соединений.


Цитата(Sam3000 @  9.9.2011,  13:35 Найти цитируемый пост)
А если у нас класс DB в другом файле и соединение используется в разных местах? 

а тут скорее всего проблема с архитектурой. сделай класс(ы) для работы с данными и работай с этими классами там где нужно, вообще паттерны в помощь...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)