Потеря соединения ODBC с базой данных SQL Server 2005 - PullRequest
2 голосов
/ 08 января 2009

У одного из наших клиентов есть приложение (FoxPro 9), работающее поверх серверной части SQL Server 2005. Периодически они теряют соединение ODBC с базой данных SQL Server. Ниже приведена исходная информация об ошибке:

Сообщение об ошибке: Ошибка подключения: [Microsoft] [Драйвер ODBC SQL Server] [DBNETLIB] ConnectionRead (recv ()).

Сообщение об ошибке ODBC: [Microsoft] [Драйвер ODBC SQL Server] [DBNETLIB] ConnectionRead (recv ()).

Состояние SQL: 01000

ODBC Err No: 10054

ODBC Handle: 1

Ошибка FoxPro №: 1526

Мы не можем продублировать эту ошибку в команде. Мы пробовали любое количество решений безрезультатно. Одно из таких аппаратных базовых решений, которое мы нашли, было описано в: http://support.microsoft.com/kb/942861/en-us

Я упоминаю об этом, потому что это почти идеально соответствует тому, что мы видели. Однако мы реализовали все обходные пути, перечисленные в этой публикации (и в этой http://support.microsoft.com/kb/948496), - и проблема все еще сохраняется.

Эта проблема, похоже, проявляется после выполнения длинных запросов, но мы не получаем никаких ошибок тайм-аута ни из приложения, ни из SQL Server. Я не верю, что это является результатом простоя, потому что это иногда происходит в середине выполняющейся программы.

Я не аппаратный аппарат, но и сеть, и сервер (Windows Server 2003) выглядят быстрыми и хорошо спроектированными. Однако бывают случаи, когда сервер базы данных находится под значительным стрессом.

Если у кого-то есть предложения по поводу того, что мы можем попробовать ... пожалуйста, сообщите нам!

Ответы [ 4 ]

1 голос
/ 04 января 2013

Использование приложения pb и ms sql в качестве базы данных, а также 2 объекта транзакции, заданных с самого начала. Одна функция проходит по курсору, используя первую транзакцию, и в этом цикле объект второй транзакции используется для обновления другой таблицы. Если явная фиксация не используется после обновления (вторая транзакция obj), то первое соединение закрывается, и я получаю [Microsoft] [Драйвер ODBC SQL Server] [DBNETLIB] ConnectionRead (recv ()). Как только я вызываю соответствующий оператор commit для соответствующей транзакции, все работает как чудо. И ДА, ошибка всегда где-то перед тем местом, где вы фактически получаете сбой, при условии, что вы находитесь в режиме отладки . Интересно, что Sybase удалось закрыть / открыть соответствующую транзакцию без необходимости явно выдавать коммит для второго объекта транзакции !!!!

1 голос
/ 06 марта 2009

Просто продолжение этого вопроса ... с частичным решением.

Я запустил трассировку, на самом деле их было много. Что я обнаружил, так это то, что существует множество причин для этих ошибок. Я смог найти и исправить один из них, но мы все еще получаем эту ошибку в других местах, и они не отображаются на следах, которые я сделал.

Так в чем же заключалась сделка с той, которую я нашел? Ну, из трассировки я обнаружил, что эти ошибки ODBC появились после другой ошибки SQL Server:

Error: 1203, Severity: 20, State: 1.
Process ID 94 attempted to unlock a resource it does not own: OBJECT: 25:1699834390:0 . Retry the transaction, because this error may be caused by a timing condition. If the problem persists, contact the database administrator.

Из кода FoxPro я обнаружил, что оператор вставки вызывал эту ошибку ... не всегда ... но иногда. В этой вставке они вытягивали все поля из одной таблицы, а некоторые поля из другой таблицы - в третью таблицу. Каждая таблица в этой базе данных имеет столбец идентификаторов с именем id_col, а оператор select, заполняющий третью таблицу, возвращает два поля id_col.

insert into tablethree 
select a.*, b.price, b.item, id_col 
from tableone a, tabletwo b 
where a.item = ....

Когда мы реструктурировали код так, чтобы возвращался только один id_col ... ошибки прекратились.

Если честно, есть еще один возможный участник этой ошибки, который я исправил в то же время. Перед этим был еще один большой / длинный запрос, который использовал синтаксис Foxpro Rushmore (например, a.item+a.customer = lc_item+lc_customer) в запросе к серверу sql. У нас раньше были проблемы с этим типом вещей, так что это может быть причиной проблемы ... но свидетельство в пользу того, что причиной является дополнительный столбец идентификации,

1 голос
/ 08 января 2009

Просто выстрел в темноте, но вы пытались запустить трассировку и пытаться перехватить события ошибок, а также любой tsql. Это может дать некоторые подсказки или помочь вам увидеть шаблон.

0 голосов
/ 13 апреля 2009

Не уверен, что вы столкнулись с полным решением, но рассматривали ли вы, прерывается ли когда-либо сетевое соединение? Одна из программ VFP, которую я разрабатывал, начала очень часто терять соединение SQL для пользователей, которые использовали ноутбуки. Казалось, что ноутбуки временно теряли соединение с сетью. Даже если соединение обрывается только на пару секунд, ручку в VFP необходимо сбросить. Не уверен, что это именно ваша проблема, но звучит похоже на меня.

...