Armenian Knowledge Base

Armenian Knowledge Base (https://forum.armkb.com/)
-   C/C++ (https://forum.armkb.com/c-c/)
-   -   Timeout (https://forum.armkb.com/c-c/17557-timeout.html)

Griffon2-7 03.06.2005 06:28

Timeout
 
Задолбался!
Как в билдере контроллировать таймаут соединения к удаленной БД??? Если сервер упал или его просто выключили, это чудо пытается 80 секунд установить соединение, а для меня - это невозможная задержка. Конкретно к Informix, если это имеет какое-то значение. цепляюсь через odbc, интерсолвовский драйвер и т.п..
Читаю help, слово timeout в Developing Database Applications встречается только в разделе TADOConnection, а я его не использую.

Agregat 07.06.2005 12:15

У тебя есть понятие ConnectionString? Так вот один из параметров ConnectionString а должен быть TimeOut-ом.

Griffon2-7 07.06.2005 12:28

Quote:

Originally Posted by Agregat
У тебя есть понятие ConnectionString? Так вот один из параметров ConnectionString а должен быть TimeOut-ом.

ConnectionString (также как и ConnectionTimeout) есть только у ADOConnection-а.

Agregat 07.06.2005 12:34

черт всюду обман :(

armeng 09.06.2005 09:53

А ты попробуй коннект с отдельного треда.

Griffon2-7 09.06.2005 10:33

Quote:

Originally Posted by armeng
А ты попробуй коннект с отдельного треда.

Гы. Дело как раз в том, что конект идет в отдельном треде, который "живет" ну допустим 10 секунд. А таймаут - 80 секунд. В итоге имеем гамно-с.
Чего-то щас нарыл в ODBC API. Копаюсь дальше...

armeng 09.06.2005 11:20

Quote:

Originally Posted by Griffon2-7
Гы. Дело как раз в том, что конект идет в отдельном треде, который "живет" ну допустим 10 секунд. А таймаут - 80 секунд. В итоге имеем гамно-с.
Чего-то щас нарыл в ODBC API. Копаюсь дальше...

Вот и прекрасно! Не дай умереть треду, пока не произайдет таймаут.

Griffon2-7 09.06.2005 11:46

Quote:

Originally Posted by armeng
Вот и прекрасно! Не дай умереть треду, пока не произайдет таймаут.

Дядь, это конечно тоже можно считать решением, но задача поставлена несколько другим образом. Мне нужно установить таймаут соединения с БД в 3-4 секунды, а не наоборот - удерживать трэд до тех пор, пока БД не вылетит по таймауту. Чувствуешь разницу?
Если я буду удерживать трэд 80+ секунд, это значит, что клиент у меня на сайте нажмет кнопку и будет 80+ секунд ждать ответа в случае если у меня плановая остановка сервера или [не дай бог] сервер БД упал. Ты знаешь много людей, которые будут 80+ секунд сидеть и ждать ответа от сайта??? Кавказ, знаешь ли :) Народ тут нетерпеливый... Цигиль-цигиль...
Трэд живет 10 секунд (даже 20-25, но никак не 80) и баста, мне надо укладываться в этот срок.

Griffon2-7 09.06.2005 11:50

Вот чего я нарыл в MSDN-е. Повоевал с борландом, и он мне это дело наконец-то побилдил. Но на SQLSetEnvAttr этот гад вылетает... Воюю...
Code:

SQLHENV        henv;
  SQLHDBC        hdbc;
  SQLHSTMT        hstmt;
  SQLRETURN  retcode;
 
            /*Allocate environment handle */
  retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
 
  if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    {
    /* Set the ODBC version environment attribute */
    retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
 
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
            /* Allocate connection handle */
            retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
 
            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                  /* Set login timeout to 5 seconds. */
                  /*SQL_API*/ SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (void*)5, 0);
 
                  /* Connect to data source */
                retcode = SQLConnect(hdbc, (SQLCHAR*) "не_ваше_дело_как_у_меня_называется_алиас", SQL_NTS,
                                (SQLCHAR*) "не_ваше_дело_какой_у_меня_логин", SQL_NTS,
                                (SQLCHAR*) "не_ваше_дело_какой_у_меня_пароль", SQL_NTS);
 
                  //if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
                  if (retcode == SQL_SUCCESS){
                          /* Allocate statement handle */
                        retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
 
                        if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                          /* Process data */
                                    ;
                                    ;
                                    ;
 
                        SQLFreeHandle(SQL_HANDLE_STMT, hstmt);               
                          }
                          SQLDisconnect(hdbc);
                  }
                  SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
            }
    }
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
 
    }


armeng 09.06.2005 12:16

Quote:

Originally Posted by Griffon2-7
Дядь, это конечно тоже можно считать решением, но задача поставлена несколько другим образом. Мне нужно установить таймаут соединения с БД в 3-4 секунды, а не наоборот - удерживать трэд до тех пор, пока БД не вылетит по таймауту. Чувствуешь разницу?
Если я буду удерживать трэд 80+ секунд, это значит, что клиент у меня на сайте нажмет кнопку и будет 80+ секунд ждать ответа в случае если у меня плановая остановка сервера или [не дай бог] сервер БД упал. Ты знаешь много людей, которые будут 80+ секунд сидеть и ждать ответа от сайта??? Кавказ, знаешь ли :) Народ тут нетерпеливый... Цигиль-цигиль...
Трэд живет 10 секунд (даже 20-25, но никак не 80) и баста, мне надо укладываться в этот срок.

Ах вот дело в чем :)
Значит у тебя веб приложение. Так, если это не cgi-ка а модуль сервера, то есть более оригинальное и красивое решение: создаешь thread safe pool коннектов с повторным использованием и коннект будет моментальным.

Griffon2-7 09.06.2005 12:38

Quote:

Originally Posted by armeng
Ах вот дело в чем :)
Значит у тебя веб приложение. Так, если это не cgi-ка а модуль сервера, то есть более оригинальное и красивое решение: создаешь thread safe pool коннектов с повторным использованием и коннект будет моментальным.

Это не веб-приложение. Приложение получает сообщение от веб-а, обрабатывает его и возвращает обратно.

armeng 09.06.2005 16:49

Quote:

Originally Posted by Griffon2-7
Это не веб-приложение. Приложение получает сообщение от веб-а, обрабатывает его и возвращает обратно.

Не очень то понятно.

У тебя классическая трехзвенная модель?
web client <-> web server <-> application (CGI/SAPI) <-> database ?

или чтот то типа
web client <-> web server <-> application (CGI/SAPI) <-> application server <-> database ?

Еще вопрос: web server Apache или IIS и платформа win/UNIX ?
Чем вызван выбор informix-а? Насколько я знаю, наличие connection timeout-а в ODBC зависит от провайдера ODBC и его может не быть.

Griffon2-7 09.06.2005 17:21

Quote:

Originally Posted by armeng
Не очень то понятно.

У тебя классическая трехзвенная модель?
web client <-> web server <-> application (CGI/SAPI) <-> database ?

или чтот то типа
web client <-> web server <-> application (CGI/SAPI) <-> application server <-> database ?

Еще вопрос: web server Apache или IIS и платформа win/UNIX ?
Чем вызван выбор informix-а? Насколько я знаю, наличие connection timeout-а в ODBC зависит от провайдера ODBC и его может не быть.

armeng, все гораздо сложнее. зачем, как, почему, чем обусловлено и т.п. совершенно не имеет значения.
Есть вполне конкретно определенная задача - установить соединение с определенным таймаутом удаленным сервером Informix через ODBC средствами Borland C++ Builder 6.

armeng 09.06.2005 17:41

Quote:

Originally Posted by Griffon2-7
armeng, все гораздо сложнее. зачем, как, почему, чем обусловлено и т.п. совершенно не имеет значения.
Есть вполне конкретно определенная задача - установить соединение с определенным таймаутом удаленным сервером Informix через ODBC средствами Borland C++ Builder 6.

2-3 секунды-очень мало для коннекта с SQL сервером. Не знаю как там у informix-а, но c oracle-ом или interbase-ом при средней базе и средней нагрузке иногда connect может длиться 1-2 минуты! Так что за 10 секунд ты вряд ли узнаешь сервер работает или нет. Вот еще смотрю informix-овские форумы, а там пишут, что timeout зависит от настроек системы (что то не вериться).
http://www.sql.ru/forum/actualthread.aspx?tid=43020

В любом случае советую в приложении иметь connection pool с уже готовыми коннектами с базой и отдавать их клиенту по мере необходимости.
В трехзвенках все (и я тоже) так делают. Проверено, коннект происходит моментально (т.к. приложение просто отдает уже готовый connection).

Griffon2-7 10.06.2005 04:03

Quote:

Originally Posted by armeng
2-3 секунды-очень мало для коннекта с SQL сервером. Не знаю как там у informix-а, но c oracle-ом или interbase-ом при средней базе и средней нагрузке иногда connect может длиться 1-2 минуты! Так что за 10 секунд ты вряд ли узнаешь сервер работает или нет. Вот еще смотрю informix-овские форумы, а там пишут, что timeout зависит от настроек системы (что то не вериться).
http://www.sql.ru/forum/actualthread.aspx?tid=43020

В любом случае советую в приложении иметь connection pool с уже готовыми коннектами с базой и отдавать их клиенту по мере необходимости.
В трехзвенках все (и я тоже) так делают. Проверено, коннект происходит моментально (т.к. приложение просто отдает уже готовый connection).

1. 2-3 секунды для конекта с Informix-ом это нормально (даже быстрее), по крайней мере не для пиковых часов. Когда у нас end-of-day мы просто прибиваем firewall-ом внешние соединения.
2. На informix-овском форуме дана информация не для клиента, а для настроек сервера, типа сколько держать "мертвый" коннект. У меня как раз такая ситуация, каковая описана в последнем постинге того топика, ссылку на которую ты дал.
3. Насчет connection pool - опять повторю, не поможет это. Моя прога работает круглосуточно, а сервер в течении дня планово закрывают firewall-ом, бывает что перезагружают и так далее. Connection pool сдохнет.


All times are GMT. The time now is 08:07.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.