powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ADODB connection глюки при переподключении
6 сообщений из 6, страница 1 из 1
ADODB connection глюки при переподключении
    #37653939
XCheSX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Прошу дать дельный совет, если кто сталкивался с подобным глюком.
Кратко опишу проблему.

Подключаюсь к базе (mySQL). Подключение устанавливается, все работает. Но сервак в целях безопасности настроен так, что если подключение неактивно в течение 20 сек. - оно разрывается. При этом при попытке запроса, отлавливаем ошибку(выходим на ошибку, так как Connection.State при разрыве все-равно open!!!), закрываем соединение (connection.Close) и заново подключаемся connection.open. Все замечательно работает на семерке(запросы выполняются сразу после reconnect), но на XP после переподключения начинается какая-то котовасия: запросы при установленном соединении не выполняются, выдает ошибки, но спустя 5-10 мин. переподключение работает и запросы выполняются, ждем 20 сек. сервак обрывает соединение - и опять после переподключения запросы не выполняются, ничего не делаем 5-10 мин - переподключение срабатывает, запросы выполняются. Иногда после переподключения запросы выполняются сразу, без ожидания, но очень редко, примерно 1 из 50 попыток.

Вот код (пишу на С++):
Повторюсь, что код прекрасно работает на 7 -ке, проблема c XP.



// функция SQL соединения.
int SQL_connect (ADODB::_ConnectionPtr *connection)
{

_bstr_t strConn = "Driver={MySQL ODBC 5.1 Driver};server=my_server;uid=my_uid;database=my_db;port=3306;option=3;";
(*connection)->CursorLocation = ADODB::adUseClient;
(*connection)->ConnectionTimeout = 1;
(*connection)->CommandTimeout = 1;
(*connection)->ConnectionString = strConn;
(*connection)->Open(strConn, "my_db", "my_password", NULL);

//При переподключении ошибка вылетает на следующей строчке
(*connection)->Execute("SET TIME_ZONE='+4:00'", FALSE, NULL);
}



int check_block(ADODB::_ConnectionPtr *connection)
{

try{
if ((*connection)->State != ADODB::adStateOpen)
SQL_connect(connection);



ADODB::_RecordsetPtr recordset_test("ADODB.Recordset");
recordset_test->Open("SELECT * FROM flag",(IDispatch*)(*connection), ADODB::adOpenDynamic,ADODB::adLockReadOnly,ADODB::adCmdText);
if(recordset_test->Fields->GetItem("value")->GetValue().lVal == 1)
{
recordset_test->Close();
return 1;
}

else
{
return 0;
}
}

catch(_com_error er)
{

//сюда приходим когда сервер закрывает соединение, после неудачи выполнения запроса "SELECT * FROM flag"


try {
(*connection)->Close(); // закрываем соединение
SQL_connect(connection); // переподключение, на этой строчке вылетает ошибка, пр попытке выполнить запрос SET TIME_ZONE='+4:00'


//повторное выполнение запроса
ADODB::_RecordsetPtr recordset_test("ADODB.Recordset");
recordset_test->Open("SELECT * FROM flag",(IDispatch*)(*connection), ADODB::adOpenDynamic,ADODB::adLockReadOnly,ADODB::adCmdText);

if(recordset_test->Fields->GetItem("value")->GetValue().lVal == 1)
{
recordset_test->Close();
return 1;
}
else
{
return 0;
}
}

catch(_com_error er)
{
return 0;
}
}

}


Что пытался сделать:
1) Отлавливал состояние Connection.State при нормальной работе и перед ошибкой - результат один и тот же - OPEN
2) Думал не хватает времени ответа сервера менял параметры соединения ConnectionTimeout и CommandTimeout - не помогло
3) Ставил задержку после connection.Open - не помогло
4)Думал глюк odbc драйвера - версия одна и та же, настройки те же.
5)Копался в Администраторе источников данных ODBC - ничего не накапал, настройки на 7-ке и XP одинаковы
6)Думал вирусняк или глюк системы - пробовал на свежеустановленной XP - проблема не исчезла.
...
Рейтинг: 0 / 0
ADODB connection глюки при переподключении
    #37654039
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XCheSX,

Что мешает использовать MySql-провайдер для .net вместо adodb?
...
Рейтинг: 0 / 0
ADODB connection глюки при переподключении
    #37654077
XCheSX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Условия ТЗ мешают.
...
Рейтинг: 0 / 0
ADODB connection глюки при переподключении
    #37654135
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XCheSX,

Хех, в т.з. написано писать на .net и использовать только adodb? Тогда сочувствую.
...
Рейтинг: 0 / 0
ADODB connection глюки при переподключении
    #37654831
XCheSX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SolYUtor, ситуевина такова, что подключение осуществляется через DLL, функции которых принимают строку запроса, а возвращают recordset в EXCEL(VBA). Если есть что-то подобное recordset-у в .NET, что потом будет понимать EXCEL(VBA)?
...
Рейтинг: 0 / 0
ADODB connection глюки при переподключении
    #37655143
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что пул соединений. Время жизни неактивного коннекта в пуле 30 сек. На вашем сервере 20 сек. Делаем выводы.

Надо или отключить пул. Или сделать что-то вроде:
МСУ не открывать :-)
Код: 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.
    public static class DbConnectionHelper
    {
        public static void OpenAndTest(DbConnection connection)
        {
            try
            {
                connection.Open();
                connection.Test();
            }
            catch
            {
                if (connection.State == ConnectionState.Broken)
                {
                    connection.Close();
                    connection.ClearPool();
                    connection.Open();
                }
                else
                    throw;
            }
        }

        internal static void Test(this DbConnection connection)
        {
            if (connection is SqlConnection)
            {
                connection.ExecuteNonQuery("/*Test connection*/");
                return;
            }

            throw new NotSupportedException();
        }

        internal static void ClearPool(this DbConnection connection)
        {
            var sqlConnection = connection as SqlConnection;
            if (sqlConnection != null)
            {
                SqlConnection.ClearPool(sqlConnection);
                return;
            }

            throw new NotSupportedException();
        }

        public static int ExecuteNonQuery(this DbConnection connection, string commandText)
        {
            using (var command = connection.CreateCommand())
            {
                command.CommandText = commandText;
                return command.ExecuteNonQuery();
            }
        }
    }

...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ADODB connection глюки при переподключении
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]