![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно организовать частые добавления в БД [D7, FB 1.5]
Ярослав © (2005-10-03 12:56:00)Ситуация такая - С устроойства через com port поступают данный, порядка 5 - 20 записей в секунду, мне все их нужно записать в БД, данные на экране пользователя должны обновляться 1 раз в секунду, как лучше добавлять данные в БД
Каждую запись отдельно с подтверждением транзакции или к примеру пакетами 1 раз в секунду и подтверждать транцакцию для всего пакета, а не для каждой отдельной записи?
Курдль (2005-10-03 16:53:00) [21]ПОСЫПАЛ ГОЛОВУ ПЕПЛОМ!!! :)
И вправду я затуманен компонентами доступа с автокоммитом!
Транзакция ОТКРЫВАЕТСЯ автоматом при активном DML!
Но, повторяю, если нет нужды - лучше транзакции не мусолить!
Тем более, что открытая транзакция напрягает сервер БД.
Sergey13 (2005-10-03 16:52:00) [22]2[32] ANB © (03.10.05 16:47)
Любой DDL запрос или (у меня вроде так) закрытие программы (сессии). Еще вроде комманды управления системой типа Alter Session.
ANB (2005-10-03 16:47:00) [23]
> Sergey13 © (03.10.05 16:45) [31]
- а как в sql plus сделать неявный коммит ?
Sergey13 (2005-10-03 16:45:00) [24]2[29] ANB © (03.10.05 16:41)
>Пока явно коммит не укажешь - ничего не запишется.
Достаточно и не явного. 8-)
ANB (2005-10-03 16:42:00) [25]
> Андрей Жук © (03.10.05 16:39) [28]
- это еще надо соответствующий уровень изоляции поставить.
ANB (2005-10-03 16:41:00) [26]
> Курдль © (03.10.05 16:07) [21]
- для оракла - пример ошибочный. Пока явно коммит не укажешь - ничего не запишется. А транзакция стартует в нем автоматически. Другое дело, если работаешь с компонентами доступа. Почти все (а других и не знаю), по умолчанию выдают коммит после каждого DML. Этот режим можно либо отключить, либо явно начинать транзакцию (начало транзакции на оракл не передается, ибо для него это бессмысленно).
Другое дело - MS SQL. Там даже в T-SQL предусмотрены команды явного начала транзакции. В противном случае - работает автокоммит. Можно ли его выключить - я не разбирался, так же не знаю, можно ли в мс скл коммитить без явного старта транзакции.
> Андрей Жук © (03.10.05 16:20) [24]
Если начнем переходить на личности, то ветку прикроют, а вам р/о опять влепят.
Андрей Жук (2005-10-03 16:39:00) [27]Естественно, разницы нет.
Пока не будет сделан COMMIT данные в не будут "закреплены".
Есть СУБД, в которых можно читать данные из неподтвержденных транзакций. Это, имхо, изврат.
Курдль (2005-10-03 16:29:00) [28]
> Андрей Жук © (03.10.05 16:20) [24]
> insert into aaa values (2);
А если так:
insert into aaa values (2)
/
?
Evgeny V (2005-10-03 16:24:00) [29]Приношу извинения, за неправильное написание ника в посте 22. Пост 22 мой:-)
Курдль (2005-10-03 16:22:00) [30]
> Evegny V (03.10.05 16:08) [22]
> -транзакцию надо стартовать для каждого запроса, включая
> select, клиентом;
> - транзакция закрывается клиентом, включая select;
Транзакция для select обусловлена замысловатой "антиблокировочной" системой IB. Это совсем не плохо, но не говорит об обязательности открытия и закрытия транзакций! Это лишь позволит избежать блокировок при перекрестном доступе.
Андрей Жук (2005-10-03 16:20:00) [31]
> Для чистоты эксперимента откройте "SQL Plus" от оракла
> (простейший интерфейс для работы с СУБД в виде
> командной строки) и исполните любую команду изменения
> данных! Уверяю, что никакого открытия или закрытия
> транзакции не потребуется, чтобы измененные данные
> утвердились в БД.
- Чем докажешь?
- Мамой клянусь!
Запускаем SQLPlus.
Создаем таблицу
SQL> create table aaa
2 (a int);
Table created.
Делаем выборку
SQL> select * from aaa;
no rows selected
Открываем второй екземпляр SQLPlus.
Добавляем запись
SQL> insert into aaa values (2);
1 row created.
Делаем выборку в первом экземпляре
SQL> select * from aaa;
no rows selected
Делаем выборку во втором экземпляре
SQL> select * from aaa;
A
----------
2
Закрываем 1 и 2 экземпляр.
Запускаем заново. Делаем выборку
SQL> select * from aaa;
no rows selected
Делаем вывод. Тов. Курдль - вы с умным видом несете ахинею.
Sergey13 (2005-10-03 16:15:00) [32]2[21] Курдль © (03.10.05 16:07)
>Уверяю, что никакого открытия или закрытия транзакции не потребуется, чтобы измененные данные утвердились в БД.
Остаются вопросы, когда это случится и не произойдет ли за это время авариии какой и хватит ли у сервака ресурсов для поддержания множества подобных сессий.
Evegny V (2005-10-03 16:08:00) [33]Курдль © >Если программист не открыл транзакцию насильственно ,то транзакция откроется, закроется или откатится автоматически под управлением СУБД.
Когда это произойдет для FB1.5?
Для IB скажем 6,5 (c 7 не работал не знаю) и FB1.5 нормальнымсчитается:
-транзакцию надо стартовать для каждого запроса, включая select, клиентом;
- транзакция закрывается клиентом, включая select;
Я не рассматриваю случаи, когда на себя это берут компоненты.
Насколько я читал, есть две модели работы с транзакциями, явного старта - это IB и клоны, есть и дргие субд, но не помню точно, какие. И вторая модель, это авто старта транзакции - это например оракл. А вот автозакрытие?? Возможно какие-то субд поддерживают, но не помню или не знаю. Закрытие по тайм-ауту или дисконнекту не рассматриваю в контексте данного вопроса.
Курдль (2005-10-03 16:07:00) [34]
> Desdechado © (03.10.05 15:56) [20]
> если кто-то считает, что это не так, то он уже успел почуствовать
> на себе тлетворное влияние "интеллектуальных" компонентов
> далнейший диспут считаю бессмысленным.
Да не могу я диспут закрыть, не только потому, что Вы упрекнули меня в незнании "азбуки СУБД", но и чтобы Ваше мнение не заразило начинающих программистов!
Для чистоты эксперимента откройте "SQL Plus" от оракла (простейший интерфейс для работы с СУБД в виде командной строки) и исполните любую команду изменения данных! Уверяю, что никакого открытия или закрытия транзакции не потребуется, чтобы измененные данные утвердились в БД.
Desdechado (2005-10-03 15:56:00) [35]> то ее и закрывать не надо
открыться-то откроется (на большинстве СУБД), то вот закрыться она сама не пожелает, ибо это противоречит азбуке СУБД
если кто-то считает, что это не так, то он уже успел почуствовать на себе тлетворное влияние "интеллектуальных" компонентов
далнейший диспут считаю бессмысленным.
Кстати, 8 млн записей в сутки - не такое уж и большое кол-во для FB. Да и размер записи важен тоже. И автор ничего не говорил о времени их хранения. Может, накопление и анализ идет понедельный, а более древнее агрегируется и списывается...
Курдль (2005-10-03 15:42:00) [36]
> Desdechado © (03.10.05 15:26) [17]
> Еще раз повторю: за программиста никто не выдаст команды
> подтверждения транзакции. Разве только особо "интеллектуальные"
> средства доступа, "угадывающие" желания программиста (по
> сути - расслабляющие и сбивающие с толку).
До чего ж Вы упрямы! Если программист не открыл транзакцию насильственно (методами компонента доступа, либо соответствующим DML типа
BEGIN TRAN[SACTION] [ transaction-name ]
то ее и закрывать не надо!!! Напр, если написать
insert into TABLE_NAME (FIELD_NAME) value (1)
то транзакция откроется, закроется или откатится автоматически под управлением СУБД.
> ANB © (03.10.05 15:33) [18]
> - точно, точно, пусть переходит на оракл !.
> ЗЫ. А куда столько инфы класть то ? Этож сколько места под
> все это надо ?
Надо еще подумать, как конфигурить оракл и на какое железо его ставить, чтобы через недельку он не сказал "до свидания, доступное дисковое пространство!".
ANB (2005-10-03 15:33:00) [37]
> Я вот тут писал все это и вдруг решил посчитать 100 х 3600
> х 24 - это ж 8 640 000 записей в сутки!!!!!!! Какой тут
> IB/FB??!!!!
- точно, точно, пусть переходит на оракл !.
ЗЫ. А куда столько инфы класть то ? Этож сколько места под все это надо ?
Desdechado (2005-10-03 15:26:00) [38]> Вы бы заявляли не так категорично! А то ж обидно, что "чушь"
Если некие средства доступа к БД скрывают функциональность сервера, то это проблема этих средств и их пользователей. Еще раз повторю: за программиста никто не выдаст команды подтверждения транзакции. Разве только особо "интеллектуальные" средства доступа, "угадывающие" желания программиста (по сути - расслабляющие и сбивающие с толку).
ANB (2005-10-03 15:22:00) [39]
> писать каждую запись отдельно... или какими нибудь пакетами
- критичность потери записей ?
Курдль (2005-10-03 15:19:00) [40]
> Ярослав (03.10.05 15:13) [14]
> Данные от устройства поступают непрерывно и целыми днями,
> и 5 - 20 записей в секунду это текущая нагрузка, она может
> увеличиться до сотни записей в секунду, вот я и думаю как
> это сделать, писать каждую запись отдельно... или какими
> нибудь пакетами
> Другие пользователи могут только читать эти записи, не добовлять
> не редактировать их не могут, да и пользователей немного
> 2-3 максимум 10
ОК! Понятно, что разбиение на пакеты скорости не добавит.
Рекомендую сделать лабораторную работу - простенькую программу, записывающую данные в БД, по объему равные рабочим. Откатать ее на предполагаемой конфигурации, а потом уже принимать решение - либо принять, как есть, либо искать компромиссы (ограничивать скорость, ....
==========================================================
Я вот тут писал все это и вдруг решил посчитать 100 х 3600 х 24 - это ж 8 640 000 записей в сутки!!!!!!! Какой тут IB/FB??!!!!