![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно организовать частые добавления в БД [D7, FB 1.5]
Ярослав © (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]если тебя не интересует каждая конкретная запись сразу после вписывания ее в БД, то лучше пакетами - это быстрее