Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Время от времени запросы начинают выводить странное... Мистика или кривые руки?  [new]
cremen
Member

Откуда: Киров
Сообщений: 16
Доброго времени суток. Рулим небольшой проект фирмы закрытый от посторонних взглядов. Это микросайтик на ASP.Net под IIS7.0, бд - MS SQL 2008R2 Datacenter (10.50.2500.0), проц 4 яйца по 2.7Гц, windows 2008 R2 64bit, оператива 6гб. В районе 10-20 запросов в секунду. В часы пик.
Работа с бд сводится к вызову хранимок с параметрами (ниже привел пример). На asp.net читаю как белый человек с помощью SQlCOmmand, executeScalar, затем кастую к decimal. В общем все как у всех. И вот иногда, судя по логам (вот тут уже мистика).
вылетаем с ошибкой, в логах к примеру ошибки начинаются с 13 (к примеру) часов и заканчиваются к 14, т.е. примерно час сервер штормит с выводом в лог ужасов, от которых шевелятся волосы. Для сторы внизу, например ошибка выглядит так:

Ошибка:
17.11.2011 13:16:45 - Была ошибка внутри GetBalance: Unable to cast object of type 'System.Byte[]' to type 'System.IConvertible'.

Потом все само прекращается. При чем такое не для всех. Т.е. в один данный момент штормит только определенных пользователей.

Стора:
CREATE PROCEDURE [dbo].[bp_GetBalance]
	@UserID int
AS
BEGIN
	SET NOCOUNT ON;
DECLARE @value money;
SELECT @value = CAST(ISNULL(SUM([value]),0)  as money)
  FROM [dbo].[bt_Pays]
  WHERE [UID] = @UserID   
   AND IsActive=1;
IF (@value<0)
	SELECT 0 as money
ELSE 		
	SELECT @value;
END

Код чтения:
lock (ParallelObject) {
                try {
                    using (SqlConnection con = new SqlConnection(ConnectionString)) {
                        con.Open();
                        using (var _bp_GetBalance = new SqlCommand("bp_GetBalance", con)) {
                            _bp_GetBalance.CommandType = System.Data.CommandType.StoredProcedure;
                            _bp_GetBalance.Parameters.AddWithValue("@UserId", UserId);
                            object o = _bp_GetBalance.ExecuteScalar();
                            if (o == DBNull.Value) {
                                Log("Ошибка базы данных, null баланс _bp_GetBalance. ");
                                return 0.0M;
                            }
                            decimal d = Convert.ToDecimal(o);
                            if (d < 0.0M) {
                                Log("Ошибка базы данных, отрицательный _bp_GetBalance. ");
                                return 0.0M;
                            }
                            return d;
                        }
                    }
                } catch( Exception e ) {
                    Log("Была ошибка внутри GetBalance: {0}", e.Message);
                    throw;
                }
            }

В логах скула чистота и благость, словно ничего и не происходит. Профайлером пока никак не удалось поймать. Помогите изловить черного гремлина.

P.S. Это я привел пример всего один. В реальности в этот черный час. Выбивает совершенно рандомно разные сторы у разных юзеров. Возможно течет память, но тогда странности были бы не только в связке БД-АСП.
18 ноя 11, 09:26    [11618042]     Ответить | Цитировать Сообщить модератору
 Re: Время от времени запросы начинают выводить странное... Мистика или кривые руки?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
cremen,

Ну что сказать, ошибка не серверная, так что наверное вам в другую ветку. И вообще, судя по коду ХП ошибка не связана с ней, смотрите что у вас там еще вызывается... Если ошибки проявляются в конкретное время и вы таки грешите на сервер, не возбраняется натравить профайлер в это время и посмотреть что происходит.
18 ноя 11, 09:47    [11618161]     Ответить | Цитировать Сообщить модератору
 Re: Время от времени запросы начинают выводить странное... Мистика или кривые руки?  [new]
cremen
Member

Откуда: Киров
Сообщений: 16
SomewhereSomehow,

Как раз проблема происходит не в определенный час, а раз в сутки в любое время. Поэтому и не удается словить профайлером. Если оставить его на постоянку, то кончается память (!) и тогда начинаются уже жесткие падения. А ошибка может не появляться по двое, трое суток. И проблема именно в связке СКУЛ+АСП. И почему я грешу на серв, иногда обычный с виду запрос выполняется вместо положенных ему миллисекунд - 30 секунд и выше, собственно вылетая по таймауту. (Хотя здесь обычный дедлок скорее всего, ведь потоков много)
18 ноя 11, 10:05    [11618263]     Ответить | Цитировать Сообщить модератору
 Re: Время от времени запросы начинают выводить странное... Мистика или кривые руки?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
cremen,

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

Google по вашей ошибке находит много ссылок и что-то нигде не упоминается сервер, что кагбэ намекает нам...
18 ноя 11, 10:12    [11618294]     Ответить | Цитировать Сообщить модератору
 Re: Время от времени запросы начинают выводить странное... Мистика или кривые руки?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
cremen,

Плохой код,
1. возврат рекордсета без наименования колонок.
2. использования не по месту SET NOCOUNT ON;
3. Это кандидат на скалярную функцию.
4. А нафига ХП , когда достаточно простого select ?

А ошибка клиентская, код кстати тоже не очень
18 ноя 11, 10:15    [11618310]     Ответить | Цитировать Сообщить модератору
 Re: Время от времени запросы начинают выводить странное... Мистика или кривые руки?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31989
cremen
И почему я грешу на серв
Вам нужно локализовать ошибку.

Текст "Была ошибка внутри GetBalance" ничего не значит, поскольку написам вами, а не сервером :-)

Может быть, поможет вывести Exception.StackTrace, или вставить дополнительно к вашему catch( Exception e ) ещё и catch (SqlException ex)...

В общем, нужна нормальная ошибка сиквела с номером и сообщением.
18 ноя 11, 10:22    [11618346]     Ответить | Цитировать Сообщить модератору
 Re: Время от времени запросы начинают выводить странное... Мистика или кривые руки?  [new]
cremen
Member

Откуда: Киров
Сообщений: 16
Ken@t,
Ну во-первых, скрипты напрямую выполнять в коде это как раз плохо. Так что стора (ну или пусть даже функция, где-то есть и такое). Хотя насчет именования колонок я передам. Идея здравая. Код такой, наверное, из-за того что люди разные следят за БД и кодом. И наверное один защищался от ошибок другого. Вполне может быть.

alexeyvg,
В скуле ошибок нету как раз, ну разве что в случае выпадания по таймауту. Стактрейс есть. И в общем ошибка тут: decimal d = Convert.ToDecimal(o); ну не может он byte[] конвертировать в decimal. Ну просто сказка. И откуда там взяться byte[]? Выводили скрипт который при этом выполняется, ну в общем он простой, exec bp_GetBalance @userId=бла-бла.

Локализацией ошибки как раз и занимаемся. Получается как раз, что стора отрабатывает нормально. Возвращает, что-то по мнению скула адекватное. А код как раз и офигевает.
18 ноя 11, 10:44    [11618476]     Ответить | Цитировать Сообщить модератору
 Re: Время от времени запросы начинают выводить странное... Мистика или кривые руки?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> SELECT 0 as money

а это вы, типа, 0 к типу money привели?

Posted via ActualForum NNTP Server 1.4

18 ноя 11, 10:56    [11618562]     Ответить | Цитировать Сообщить модератору
 Re: Время от времени запросы начинают выводить странное... Мистика или кривые руки?  [new]
cremen
Member

Откуда: Киров
Сообщений: 16
daw,

гы, насколько я знаю SQL, это же не приведение, это именование столбца... воот, первые кривые руки всплывают. спс.
18 ноя 11, 11:37    [11618895]     Ответить | Цитировать Сообщить модератору
 Re: Время от времени запросы начинают выводить странное... Мистика или кривые руки?  [new]
step_ks
Member

Откуда:
Сообщений: 936
Ken@t
cremen,

Плохой код,
...
2. использования не по месту SET NOCOUNT ON;

А что такого? Вообще никогда не понимал, зачем нужен SET NOCOUNT OFF по-умолчанию .
18 ноя 11, 13:17    [11619992]     Ответить | Цитировать Сообщить модератору
 Re: Время от времени запросы начинают выводить странное... Мистика или кривые руки?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31989
cremen
alexeyvg,
В скуле ошибок нету как раз, ну разве что в случае выпадания по таймауту. Стактрейс есть. И в общем ошибка тут: decimal d = Convert.ToDecimal(o); ну не может он byte[] конвертировать в decimal. Ну просто сказка. И откуда там взяться byte[]? Выводили скрипт который при этом выполняется, ну в общем он простой, exec bp_GetBalance @userId=бла-бла.

Локализацией ошибки как раз и занимаемся. Получается как раз, что стора отрабатывает нормально. Возвращает, что-то по мнению скула адекватное. А код как раз и офигевает.
Вы хотя бы StackTrace выведите, может что то будет видно.

Может, глюк ExecuteScalar

А вообще, нормально вместо такой лапши по всему коду сделать функцию для вызова ХП, выводящую простой массив, и не пользоваться ExecuteScalar; потом в коде вызывать уже эту функцию.

А то найдёте ошибку в вызове, и будете весь код править :-)

Или начальник скажет: "и ещё это, везде при дедлоке повторяте вызов пару раз" - и опять программисты работают...

ЗЫ. Зачем тут lock (ParallelObject)? просто чтоб помедленнее работало?
18 ноя 11, 13:24    [11620051]     Ответить | Цитировать Сообщить модератору
 Re: Время от времени запросы начинают выводить странное... Мистика или кривые руки?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
step_ks
А что такого? Вообще никогда не понимал, зачем нужен SET NOCOUNT OFF по-умолчанию .

Это ваша проблема непонимания.
ЗЫ. Открою вам тайну, что с скулем может работать более одного клиента на разных платформах .
18 ноя 11, 13:33    [11620156]     Ответить | Цитировать Сообщить модератору
 Re: Время от времени запросы начинают выводить странное... Мистика или кривые руки?  [new]
step_ks
Member

Откуда:
Сообщений: 936
Ken@t
step_ks
А что такого? Вообще никогда не понимал, зачем нужен SET NOCOUNT OFF по-умолчанию .

Это ваша проблема непонимания.

Да ладно вам - какая уж это проблема. Есть SET , кому надо - поставит.

Ken@t
step_ks
ЗЫ. Открою вам тайну, что с скулем может работать более одного клиента на разных платформах .

Воистину это так.
18 ноя 11, 21:59    [11623549]     Ответить | Цитировать Сообщить модератору
 Re: Время от времени запросы начинают выводить странное... Мистика или кривые руки?  [new]
Volochkova
Member

Откуда:
Сообщений: 2321
IMHO

вместо

IF (@value<0)
	SELECT 0 as money
ELSE 		
	SELECT @value;



сделать так
IF (ISNULL(@value,0)<=0)
	SELECT  @value = 0 

SELECT @value;
19 ноя 11, 12:46    [11624785]     Ответить | Цитировать Сообщить модератору
 Re: Время от времени запросы начинают выводить странное... Мистика или кривые руки?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Volochkova,

можно вообще без этой ветки обойтись если все сделать в кейсе, думаю, вопрос то был не в этом.
20 ноя 11, 18:21    [11627854]     Ответить | Цитировать Сообщить модератору
 Re: Время от времени запросы начинают выводить странное... Мистика или кривые руки?  [new]
SomeUserSQL
Guest
Не знаю как вы, а я привык выводить результаты (если они не табличного типа) параметрами output.Как по мне - меньше гемороя.
20 ноя 11, 20:39    [11628266]     Ответить | Цитировать Сообщить модератору
 Re: Время от времени запросы начинают выводить странное... Мистика или кривые руки?  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
В таком виде может ни один селект не выполнится...
Соответственно рекордсет не вернётся.
21 ноя 11, 00:09    [11628998]     Ответить | Цитировать Сообщить модератору
 Re: Время от времени запросы начинают выводить странное... Мистика или кривые руки?  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
Имхо, программист БД t-sql не знает.

Да и в целом не красиво в плане архитектуры.
Если бизнес-логика в ХП, зачем вот эта обработка:
Log("Ошибка базы данных, null баланс _bp_GetBalance. ")
Log("Ошибка базы данных, отрицательный _bp_GetBalance. ")?
Если что-то поменяется в логике, код будете править и в БД и в приложении?
Например завтра будет принято решение, что отрицательный баланс имеет право на жизнь...

Рекордсет здесь зачем вообще?
Правильно было сказано - надо использовать параметры в данном конкретном случае.
21 ноя 11, 03:54    [11629239]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить