|
ADODB connection глюки при переподключении
|
|||
---|---|---|---|
#18+
Доброго времени суток! Прошу дать дельный совет, если кто сталкивался с подобным глюком. Кратко опишу проблему. Подключаюсь к базе (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 - проблема не исчезла. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2012, 15:05 |
|
ADODB connection глюки при переподключении
|
|||
---|---|---|---|
#18+
XCheSX, Что мешает использовать MySql-провайдер для .net вместо adodb? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2012, 15:38 |
|
ADODB connection глюки при переподключении
|
|||
---|---|---|---|
#18+
Условия ТЗ мешают. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2012, 15:47 |
|
ADODB connection глюки при переподключении
|
|||
---|---|---|---|
#18+
XCheSX, Хех, в т.з. написано писать на .net и использовать только adodb? Тогда сочувствую. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2012, 16:09 |
|
ADODB connection глюки при переподключении
|
|||
---|---|---|---|
#18+
SolYUtor, ситуевина такова, что подключение осуществляется через DLL, функции которых принимают строку запроса, а возвращают recordset в EXCEL(VBA). Если есть что-то подобное recordset-у в .NET, что потом будет понимать EXCEL(VBA)? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2012, 21:11 |
|
ADODB connection глюки при переподключении
|
|||
---|---|---|---|
#18+
Потому что пул соединений. Время жизни неактивного коннекта в пуле 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 06:02 |
|
|
start [/forum/topic.php?fid=17&msg=37654077&tid=1350443]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
74ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 165ms |
0 / 0 |