Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно организовать частые добавления в БД [D7, FB 1.5]


Страницы:   1 2 3

Ярослав ©   (2005-10-03 12:56:00) 

Ситуация такая - С устроойства через com port поступают данный, порядка 5 - 20 записей в секунду, мне все их нужно записать в БД, данные на экране пользователя должны обновляться 1 раз в секунду, как лучше добавлять  данные в БД
Каждую запись отдельно с подтверждением транзакции или к примеру пакетами 1 раз в секунду и подтверждать транцакцию для всего пакета, а не для каждой отдельной записи?


Ярослав   (2005-10-03 15:13:00) [41]

Данные от устройства поступают непрерывно и целыми днями, и 5 - 20 записей в секунду это текущая нагрузка, она может увеличиться до сотни записей в секунду, вот я и думаю как это сделать, писать каждую запись отдельно... или какими нибудь пакетами
Другие пользователи могут только читать эти записи, не добовлять не редактировать их не могут, да и пользователей немного 2-3 максимум 10


Ярослав   (2005-10-03 15:13:00) [42]

Данные от устройства поступают непрерывно и целыми днями, и 5 - 20 записей в секунду это текущая нагрузка, она может увеличиться до сотни записей в секунду, вот я и думаю как это сделать, писать каждую запись отдельно... или какими нибудь пакетами
Другие пользователи могут только читать эти записи, не добовлять не редактировать их не могут, да и пользователей немного 2-3 максимум 10


Курдль   (2005-10-03 15:02:00) [43]

Ок! Вопрос к автору, который поможет вникнуть в проблему.
Данные поступают от устройства непрерывно, или когда-то останавливаются?
Если целыми днями непрерывно - есть смысл писать непрерывно. Я работал с ИБ, но не при помощи компонентов IB..., а с SQLDirect через ODBC.  Помню, что тестовая программа для контроля производительности писала строки в IB сотнями, а то и тысячами в секунду.
Если других пользователей не будет - я думаю и проблем не будет.


ANB   (2005-10-03 14:55:00) [44]


> Ярослав   (03.10.05 14:43) [9]


> Курдль ©   (03.10.05 14:52) [10]

Автор не просил холивара, он просил совета.
ЗЫ. Я с ИБ/ФБ не работаю, посему толком посоветовать ничего не могу.


Курдль   (2005-10-03 14:52:00) [45]


> :)) Для кого звучное слово, а кто этим постоянно пользуестя


Не обижайтесь, возможно я вспылил по отношению к Вам! Переходите на более сложные инструменты - тоже забудете о таких мелочах! :)


Ярослав   (2005-10-03 14:43:00) [46]

> Курдль ©   (03.10.05 13:14) [3]
> Чаще всего компоненты доступа сами разбираются с транзакциями на низшем уровне. Думаю, что "IB..." делают так же.

В IB управление транзакциями возможно только на клиенте
В компонентах можно настроить чтобы транзакция подтвердалась после добавления каждой записи, а можно и управлять ими вручную

> Меня всегда развлекало манипулирование термином "транзакция". Такое впечатление, что программист пытается прибавить себе значимости звучным словом :)
:)) Для кого звучное слово, а кто этим постоянно пользуестя :)


ANB   (2005-10-03 14:37:00) [47]

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

По сабжу : сделать буфферизацию и получение / складывание в базу строк развести асинхронно (можно в разных потоках).


Курдль   (2005-10-03 14:24:00) [48]


> Desdechado ©   (03.10.05 14:00) [6]
>
> > свойство СУБД - они сами закрывают транзакции по умолчанию
> чушь
>
> закрытие требует явной команды commit или rollback (rollback
> может быть неявным - при ошибке, НП)
>


Вы бы заявляли не так категорично! А то ж обидно, что "чушь"! :)

Повторяю: "УВАЖАЮЩИЕ СЕБЯ СУБД, И ИНТЭРБЭЙС В ТОМ ЧИСЛЕ, ОТРАБАТЫВАЮТ ТРАНЗАКЦИОННЫЙ ПРОЦЕСС БЕЗ ВНЕШНЕГО ВМЕШАТЕЛЬСТВА"!

Закрытие транзакции и вправду требует явного указания, но в случае, если транзакция была ЯВНО ОТКРЫТА!

Думаю, что компоненты IB, как наследники от TDataSet и TDataBase вполне исполнят такой код:

DataBase.ApplyUpdates([DataSetMaster, DataSetSlave1, DataSetSlave2...]);

При этом транзакция автоматически откроется, данные занесутся в бд и транзакция закроется, либо откатится.


Desdechado   (2005-10-03 14:00:00) [49]

> свойство СУБД - они сами закрывают транзакции по умолчанию
чушь

закрытие требует явной команды commit или rollback (rollback может быть неявным - при ошибке, НП)

компоненты могут сами ее делать, но это нельзя назвать грамотным применением
Запись пачками - это и есть ЯВНОЕ указание транзакций, ибо по умолчанию "одна операция - одна транзакция" (по крайней мере, в БДЕ). В IBExpress - там вообще любую транзакцию надо явно указывать. Имхо, авторы компонентов перегнули палку, но все-таки в правильную сторону.


Курдль   (2005-10-03 13:51:00) [50]


> Desdechado ©   (03.10.05 13:47) [4]
> понимать механизм транзакций и грамотно применять его -
> важно
> кто считает иначе - неуч без возможности лечения


Однозначно согласен! Пихать транзакции куда ни попадя - это и есть неграмотное их применение!

Вот Вы, как вижу, неправильно понимаете механизм транзакций.
Например то свойство СУБД, что они сами открывают, закрывают (или откатывают транзакции в случае ошибки) по умолчанию при любом активном DML (не select).


Desdechado   (2005-10-03 13:47:00) [51]

> забудьте про транзакции
вредный совет

понимать механизм транзакций и грамотно применять его - важно
кто считает иначе - неуч без возможности лечения


Курдль   (2005-10-03 13:14:00) [52]


> Ярослав   (03.10.05 12:56)
> Каждую запись отдельно с подтверждением транзакции или к
> примеру пакетами 1 раз в секунду и подтверждать транцакцию
> для всего пакета, а не для каждой отдельной записи?


Меня всегда развлекало манипулирование термином "транзакция". Такое впечатление, что программист пытается прибавить себе значимости звучным словом :)

Чаще всего компоненты доступа сами разбираются с транзакциями на низшем уровне. Думаю, что "IB..." делают так же. Если Вам не надо отслеживать пакеты взаимосвязанных записей разных таблиц (которые либо все должны попасть в БД, либо все отмениться), - забудьте про транзакции! Работайте простыми DML!


Sergey13   (2005-10-03 13:02:00) [53]

Я бы для начала разделил задачу на две (независимые).
1. Добавление.
2. Показ юзеру.

>данные на экране пользователя должны обновляться 1 раз в секунду
Глазки у него не заболят? 8-)


Desdechado   (2005-10-03 13:02:00) [54]

если тебя не интересует каждая конкретная запись сразу после вписывания ее в БД, то лучше пакетами - это быстрее


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо