 |
Timeout |
 |
03.06.2005, 06:28
|
#1
|
hex god
Join Date: 03 2002
Location: Yerevan, AM
Age: 47
Posts: 3,172
Rep Power: 0
|
Timeout
Задолбался!
Как в билдере контроллировать таймаут соединения к удаленной БД??? Если сервер упал или его просто выключили, это чудо пытается 80 секунд установить соединение, а для меня - это невозможная задержка. Конкретно к Informix, если это имеет какое-то значение. цепляюсь через odbc, интерсолвовский драйвер и т.п..
Читаю help, слово timeout в Developing Database Applications встречается только в разделе TADOConnection, а я его не использую.
__________________
Ленинградское время 0 часов 0 минут
Last edited by Griffon2-7; 03.06.2005 at 06:45.
|
|
|
07.06.2005, 12:15
|
#2
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
У тебя есть понятие ConnectionString? Так вот один из параметров ConnectionString а должен быть TimeOut-ом.
|
|
|
07.06.2005, 12:28
|
#3
|
hex god
Join Date: 03 2002
Location: Yerevan, AM
Age: 47
Posts: 3,172
Rep Power: 0
|
Quote:
Originally Posted by Agregat
У тебя есть понятие ConnectionString? Так вот один из параметров ConnectionString а должен быть TimeOut-ом.
|
ConnectionString (также как и ConnectionTimeout) есть только у ADOConnection-а.
__________________
Ленинградское время 0 часов 0 минут
|
|
|
07.06.2005, 12:34
|
#4
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
черт всюду обман
|
|
|
09.06.2005, 09:53
|
#5
|
Дошкольник
Join Date: 03 2003
Location: 2A
Age: 57
Posts: 104
Rep Power: 0
|
А ты попробуй коннект с отдельного треда.
|
|
|
09.06.2005, 10:33
|
#6
|
hex god
Join Date: 03 2002
Location: Yerevan, AM
Age: 47
Posts: 3,172
Rep Power: 0
|
Quote:
Originally Posted by armeng
А ты попробуй коннект с отдельного треда.
|
Гы. Дело как раз в том, что конект идет в отдельном треде, который "живет" ну допустим 10 секунд. А таймаут - 80 секунд. В итоге имеем гамно-с.
Чего-то щас нарыл в ODBC API. Копаюсь дальше...
__________________
Ленинградское время 0 часов 0 минут
|
|
|
09.06.2005, 11:20
|
#7
|
Дошкольник
Join Date: 03 2003
Location: 2A
Age: 57
Posts: 104
Rep Power: 0
|
Quote:
Originally Posted by Griffon2-7
Гы. Дело как раз в том, что конект идет в отдельном треде, который "живет" ну допустим 10 секунд. А таймаут - 80 секунд. В итоге имеем гамно-с.
Чего-то щас нарыл в ODBC API. Копаюсь дальше...
|
Вот и прекрасно! Не дай умереть треду, пока не произайдет таймаут.
|
|
|
09.06.2005, 11:46
|
#8
|
hex god
Join Date: 03 2002
Location: Yerevan, AM
Age: 47
Posts: 3,172
Rep Power: 0
|
Quote:
Originally Posted by armeng
Вот и прекрасно! Не дай умереть треду, пока не произайдет таймаут.
|
Дядь, это конечно тоже можно считать решением, но задача поставлена несколько другим образом. Мне нужно установить таймаут соединения с БД в 3-4 секунды, а не наоборот - удерживать трэд до тех пор, пока БД не вылетит по таймауту. Чувствуешь разницу?
Если я буду удерживать трэд 80+ секунд, это значит, что клиент у меня на сайте нажмет кнопку и будет 80+ секунд ждать ответа в случае если у меня плановая остановка сервера или [не дай бог] сервер БД упал. Ты знаешь много людей, которые будут 80+ секунд сидеть и ждать ответа от сайта??? Кавказ, знаешь ли  Народ тут нетерпеливый... Цигиль-цигиль...
Трэд живет 10 секунд (даже 20-25, но никак не 80) и баста, мне надо укладываться в этот срок.
__________________
Ленинградское время 0 часов 0 минут
|
|
|
 |
|
 |
09.06.2005, 11:50
|
#9
|
hex god
Join Date: 03 2002
Location: Yerevan, AM
Age: 47
Posts: 3,172
Rep Power: 0
|
Вот чего я нарыл в 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);
}
__________________
Ленинградское время 0 часов 0 минут
|
|
|
 |
 |
|
 |
09.06.2005, 12:16
|
#10
|
Дошкольник
Join Date: 03 2003
Location: 2A
Age: 57
Posts: 104
Rep Power: 0
|
Quote:
Originally Posted by Griffon2-7
Дядь, это конечно тоже можно считать решением, но задача поставлена несколько другим образом. Мне нужно установить таймаут соединения с БД в 3-4 секунды, а не наоборот - удерживать трэд до тех пор, пока БД не вылетит по таймауту. Чувствуешь разницу?
Если я буду удерживать трэд 80+ секунд, это значит, что клиент у меня на сайте нажмет кнопку и будет 80+ секунд ждать ответа в случае если у меня плановая остановка сервера или [не дай бог] сервер БД упал. Ты знаешь много людей, которые будут 80+ секунд сидеть и ждать ответа от сайта??? Кавказ, знаешь ли  Народ тут нетерпеливый... Цигиль-цигиль...
Трэд живет 10 секунд (даже 20-25, но никак не 80) и баста, мне надо укладываться в этот срок.
|
Ах вот дело в чем 
Значит у тебя веб приложение. Так, если это не cgi-ка а модуль сервера, то есть более оригинальное и красивое решение: создаешь thread safe pool коннектов с повторным использованием и коннект будет моментальным.
|
|
|
 |
09.06.2005, 12:38
|
#11
|
hex god
Join Date: 03 2002
Location: Yerevan, AM
Age: 47
Posts: 3,172
Rep Power: 0
|
Quote:
Originally Posted by armeng
Ах вот дело в чем 
Значит у тебя веб приложение. Так, если это не cgi-ка а модуль сервера, то есть более оригинальное и красивое решение: создаешь thread safe pool коннектов с повторным использованием и коннект будет моментальным.
|
Это не веб-приложение. Приложение получает сообщение от веб-а, обрабатывает его и возвращает обратно.
__________________
Ленинградское время 0 часов 0 минут
|
|
|
09.06.2005, 16:49
|
#12
|
Дошкольник
Join Date: 03 2003
Location: 2A
Age: 57
Posts: 104
Rep Power: 0
|
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 и его может не быть.
|
|
|
09.06.2005, 17:21
|
#13
|
hex god
Join Date: 03 2002
Location: Yerevan, AM
Age: 47
Posts: 3,172
Rep Power: 0
|
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.
__________________
Ленинградское время 0 часов 0 минут
|
|
|
 |
|
 |
09.06.2005, 17:41
|
#14
|
Дошкольник
Join Date: 03 2003
Location: 2A
Age: 57
Posts: 104
Rep Power: 0
|
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).
|
|
|
 |
 |
|
 |
10.06.2005, 04:03
|
#15
|
hex god
Join Date: 03 2002
Location: Yerevan, AM
Age: 47
Posts: 3,172
Rep Power: 0
|
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 сдохнет.
__________________
Ленинградское время 0 часов 0 минут
|
|
|
 |
All times are GMT. The time now is 03:07. |
|
|