Armenian Knowledge Base  

Go Back   Armenian Knowledge Base > Technical sections > Languages, Compilers, Interpreters > C/C++
Register

Reply
 
LinkBack Thread Tools
Old 03.06.2005, 07:28   #1
hex god
 
Griffon2-7's Avatar
 
Join Date: 03 2002
Location: Yerevan, AM
Age: 39
Posts: 3,172
Downloads: 1
Uploads: 0
Reputation: 9 | 0
Default Timeout

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

Last edited by Griffon2-7; 03.06.2005 at 07:45.
Reply With Quote
Old 07.06.2005, 13:15   #2
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

У тебя есть понятие ConnectionString? Так вот один из параметров ConnectionString а должен быть TimeOut-ом.
Reply With Quote
Old 07.06.2005, 13:28   #3
hex god
 
Griffon2-7's Avatar
 
Join Date: 03 2002
Location: Yerevan, AM
Age: 39
Posts: 3,172
Downloads: 1
Uploads: 0
Reputation: 9 | 0
Default

Quote:
Originally Posted by Agregat
У тебя есть понятие ConnectionString? Так вот один из параметров ConnectionString а должен быть TimeOut-ом.
ConnectionString (также как и ConnectionTimeout) есть только у ADOConnection-а.
Reply With Quote
Old 07.06.2005, 13:34   #4
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

черт всюду обман
Reply With Quote
Old 09.06.2005, 10:53   #5
Дошкольник
 
Join Date: 03 2003
Location: 2A
Age: 49
Posts: 104
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

А ты попробуй коннект с отдельного треда.
Reply With Quote
Old 09.06.2005, 11:33   #6
hex god
 
Griffon2-7's Avatar
 
Join Date: 03 2002
Location: Yerevan, AM
Age: 39
Posts: 3,172
Downloads: 1
Uploads: 0
Reputation: 9 | 0
Default

Quote:
Originally Posted by armeng
А ты попробуй коннект с отдельного треда.
Гы. Дело как раз в том, что конект идет в отдельном треде, который "живет" ну допустим 10 секунд. А таймаут - 80 секунд. В итоге имеем гамно-с.
Чего-то щас нарыл в ODBC API. Копаюсь дальше...
Reply With Quote
Old 09.06.2005, 12:20   #7
Дошкольник
 
Join Date: 03 2003
Location: 2A
Age: 49
Posts: 104
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Quote:
Originally Posted by Griffon2-7
Гы. Дело как раз в том, что конект идет в отдельном треде, который "живет" ну допустим 10 секунд. А таймаут - 80 секунд. В итоге имеем гамно-с.
Чего-то щас нарыл в ODBC API. Копаюсь дальше...
Вот и прекрасно! Не дай умереть треду, пока не произайдет таймаут.
Reply With Quote
Old 09.06.2005, 12:46   #8
hex god
 
Griffon2-7's Avatar
 
Join Date: 03 2002
Location: Yerevan, AM
Age: 39
Posts: 3,172
Downloads: 1
Uploads: 0
Reputation: 9 | 0
Default

Quote:
Originally Posted by armeng
Вот и прекрасно! Не дай умереть треду, пока не произайдет таймаут.
Дядь, это конечно тоже можно считать решением, но задача поставлена несколько другим образом. Мне нужно установить таймаут соединения с БД в 3-4 секунды, а не наоборот - удерживать трэд до тех пор, пока БД не вылетит по таймауту. Чувствуешь разницу?
Если я буду удерживать трэд 80+ секунд, это значит, что клиент у меня на сайте нажмет кнопку и будет 80+ секунд ждать ответа в случае если у меня плановая остановка сервера или [не дай бог] сервер БД упал. Ты знаешь много людей, которые будут 80+ секунд сидеть и ждать ответа от сайта??? Кавказ, знаешь ли Народ тут нетерпеливый... Цигиль-цигиль...
Трэд живет 10 секунд (даже 20-25, но никак не 80) и баста, мне надо укладываться в этот срок.
Reply With Quote
Old 09.06.2005, 12:50   #9
hex god
 
Griffon2-7's Avatar
 
Join Date: 03 2002
Location: Yerevan, AM
Age: 39
Posts: 3,172
Downloads: 1
Uploads: 0
Reputation: 9 | 0
Default

Вот чего я нарыл в 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);
 
    }
Reply With Quote
Old 09.06.2005, 13:16   #10
Дошкольник
 
Join Date: 03 2003
Location: 2A
Age: 49
Posts: 104
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Quote:
Originally Posted by Griffon2-7
Дядь, это конечно тоже можно считать решением, но задача поставлена несколько другим образом. Мне нужно установить таймаут соединения с БД в 3-4 секунды, а не наоборот - удерживать трэд до тех пор, пока БД не вылетит по таймауту. Чувствуешь разницу?
Если я буду удерживать трэд 80+ секунд, это значит, что клиент у меня на сайте нажмет кнопку и будет 80+ секунд ждать ответа в случае если у меня плановая остановка сервера или [не дай бог] сервер БД упал. Ты знаешь много людей, которые будут 80+ секунд сидеть и ждать ответа от сайта??? Кавказ, знаешь ли Народ тут нетерпеливый... Цигиль-цигиль...
Трэд живет 10 секунд (даже 20-25, но никак не 80) и баста, мне надо укладываться в этот срок.
Ах вот дело в чем
Значит у тебя веб приложение. Так, если это не cgi-ка а модуль сервера, то есть более оригинальное и красивое решение: создаешь thread safe pool коннектов с повторным использованием и коннект будет моментальным.
Reply With Quote
Old 09.06.2005, 13:38   #11
hex god
 
Griffon2-7's Avatar
 
Join Date: 03 2002
Location: Yerevan, AM
Age: 39
Posts: 3,172
Downloads: 1
Uploads: 0
Reputation: 9 | 0
Default

Quote:
Originally Posted by armeng
Ах вот дело в чем
Значит у тебя веб приложение. Так, если это не cgi-ка а модуль сервера, то есть более оригинальное и красивое решение: создаешь thread safe pool коннектов с повторным использованием и коннект будет моментальным.
Это не веб-приложение. Приложение получает сообщение от веб-а, обрабатывает его и возвращает обратно.
Reply With Quote
Old 09.06.2005, 17:49   #12
Дошкольник
 
Join Date: 03 2003
Location: 2A
Age: 49
Posts: 104
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

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 и его может не быть.
Reply With Quote
Old 09.06.2005, 18:21   #13
hex god
 
Griffon2-7's Avatar
 
Join Date: 03 2002
Location: Yerevan, AM
Age: 39
Posts: 3,172
Downloads: 1
Uploads: 0
Reputation: 9 | 0
Default

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.
Reply With Quote
Old 09.06.2005, 18:41   #14
Дошкольник
 
Join Date: 03 2003
Location: 2A
Age: 49
Posts: 104
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

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).
Reply With Quote
Old 10.06.2005, 05:03   #15
hex god
 
Griffon2-7's Avatar
 
Join Date: 03 2002
Location: Yerevan, AM
Age: 39
Posts: 3,172
Downloads: 1
Uploads: 0
Reputation: 9 | 0
Default

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 сдохнет.
Reply With Quote
Sponsored Links
Reply

Thread Tools


На правах рекламы:
реклама

All times are GMT. The time now is 03:16.


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