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 раз в секунду и подтверждать транцакцию для всего пакета, а не для каждой отдельной записи?


ANB   (2005-10-04 12:33:00) [1]


> Андрей Жук ©   (03.10.05 18:20) [36]
>
> > ЗЫ. А таки работа с транзакциями в оракле мне больше
> > всего нравится.
>
> Особенно невозможность сделать COMMIT в теле процедуры..
> .
- добавь прагму автономных транзакций и коммить сколько хочешь. А решение - верное.


Val   (2005-10-04 12:30:00) [2]

>Андрей Жук ©   (04.10.05 12:23)
"если" можно придумать для чего угодно. если усердно искать проблем на задницу - обязательно найдутся :)
речь шла не о дурном применении коммита в процедуре, а о его невозможности, насколько я помню.


Курдль   (2005-10-04 12:24:00) [3]


> Sergey13 ©   (04.10.05 11:57) [48]
> У автора нигде вроде нет требований работы 24*7. У него
> вообще видимо пропал интерес к этому своему вопросу. 8-(


Мы тут не только для того, чтобы авторов ублажать! :)
И даже не для того, чтобы "себя показать и на мир посмотреть". Зачастую полезно смоделировать и обсудить какую-то ситуацию, с которой, возможно, придется столкнуться самому.


Sergey13   (2005-10-04 12:24:00) [4]

2[49] Курдль ©   (04.10.05 12:21)
Сори, действительно просмотрел. Но и тут непонятно, хранятся ли данные постоянно, или периодически "чистятся".


Андрей Жук   (2005-10-04 12:23:00) [5]


>create or replace myproc
>as
> lVar number;
>begin
> insert into my_tyable (my_field) values (1);
> commit;
> select max(my_field) into lVar
> from my_table;
> end;

Оно то так, только если будет изменение множества записей в процедуре с commit в каждой итерации, то нарвемся на snapshot too old.
Вообще, Том Кайт в главе о транзакциях подробно описывает, почему нежелательна фиксация изменений в процедуре.


Курдль   (2005-10-04 12:21:00) [6]


> Ярослав   (03.10.05 15:13) [14]
>
> Данные от устройства поступают непрерывно и целыми днями,
>  и 5 - 20 записей в секунду это текущая нагрузка, она может
> увеличиться до сотни записей в секунду, вот я и думаю как
> это сделать, писать каждую запись отдельно... или какими
> нибудь пакетами
> Другие пользователи могут только читать эти записи, не добовлять
> не редактировать их не могут, да и пользователей немного
> 2-3 максимум 10
>


Sergey13   (2005-10-04 11:57:00) [7]

2[46] Курдль ©   (04.10.05 11:40)
>А почему никто всерьез не принял проблему "8 000 000 записей в сутки"?
Потому что пока это только твои выдумки. 8-)
У автора нигде вроде нет требований работы 24*7. У него вообще видимо пропал интерес к этому своему вопросу. 8-(


Os   (2005-10-04 11:57:00) [8]

как я понял с постановки задачи это какой-то счетчик и записи за прошедший час нужно обработать и удалить.


Курдль   (2005-10-04 11:40:00) [9]

А почему никто всерьез не принял проблему "8 000 000 записей в сутки"?
Или все считают, что FB 1.5 нормально с этим справится?
Я думаю, что здесь нужен какой-то механизм архивирования утративших актуальность записей, или их полного уничтожения через определенный срок.


Os   (2005-10-04 11:33:00) [10]

Грабли есть в постановке задачи.
- 1-я задача запись в базу
- 2-я задача чтение данных оператором.
- и появится 3-я задача, убирать ненужные данные после их обработки.
На запись данных потребуется свой компонент транзакции, чтобы его никто не зарулил в других задачах. Свойства транзакций надо задавать вручную, а не использовать по умолчанию.
И запись данных я бы организовал не по времени, а по заполнению буфера.


Val   (2005-10-04 11:25:00) [11]

>[36] Андрей Жук ©   (03.10.05 18:20)
что подразумевается? мне до сих пор никто не мешал написать:

create or replace myproc
as
 lVar number;
begin
 insert into my_tyable (my_field) values (1);
 commit;
 select max(my_field) into lVar
 from my_table;
end;
/


sniknik   (2005-10-04 11:21:00) [12]

> Если уж на то пошло:

а так не лучше? во избежание ;о))
IBTransaction.StartTransaction;
try
 for i := 0 to Buffer.Count - 1 do begin
   SetSQLParams(IBSQL, Buffer[i]);
   IBSQL.ExecQuery;
   if (i mod 1000 = 0) and (i <> 0) then begin
     IBTransaction.Commit;
     IBTransaction.StartTransaction;
   end;
 end;
 IBTransaction.Commit;
except
 IBTransaction.Rollback;
end;


Курдль   (2005-10-04 11:12:00) [13]

> IBTransaction.StartTransaction;
> try
>  for i := 0 to Buffer.Count - 1 do
>  begin
>    SetSQLParams(IBSQL, Buffer[i]);
>    IBSQL.ExecQuery;
>  end;
> finally
>  IBTransaction.Commit;
> end;

Странноватая конструкция...

Если уж на то пошло:


IBTransaction.StartTransaction;
try
for i := 0 to Buffer.Count - 1 do
begin
  SetSQLParams(IBSQL, Buffer[i]);
  IBSQL.ExecQuery;
end;
IBTransaction.Commit;
except
IBTransaction.Rollback;
end;


ANB   (2005-10-04 10:46:00) [14]


> IBTransaction.StartTransaction;
> try
>  for i := 0 to Buffer.Count - 1 do
>  begin
>    SetSQLParams(IBSQL, Buffer[i]);
>    IBSQL.ExecQuery;
>  end;
> finally
>  IBTransaction.Commit;
> end;

- здесь никаких. Кроме лишнего кода. А лишний код - источник граблей. Плюс - а если кто то будет использовать эту процедуру и откроет транзакцию заранее ? Классические грабли в БДЕ : пишется процедура, которая запускает и коммитит транзакцию для одной записи. Другой программист пишет другую процедуру, в которой нужно добавить 2 связанные записи, одна из оторых очень хорошо добаляется первой процедурой. Не задумываясь, второй программист открывает транзакцию, добавляет свою запись, вызывает первую процедуру и наступает на грабли.


Desdechado   (2005-10-04 10:36:00) [15]

> ПОСЫПАЛ ГОЛОВУ ПЕПЛОМ
Хорошо, хоть хватило мужества признать свою ошибку :)

> Тем более, что открытая транзакция напрягает сервер БД.
Тебе ее все равно открывать нужно, причем если на каждую запись своя транзакция, то открывать их нужно много, что больше напрягает сервер, чем 1 транзакция в секунду на 5-100 записей.


Виталий Панасенко   (2005-10-04 10:17:00) [16]

Ссылаюсь на Ч.Калверта - "замечено, что применение кешированных изменений увеличивает производительность".. В принципе, нет никакого отличия от пакетного варианта..Я о возможной потери данных.. Так как и в пакетном варианте до подтверждения транзакции все равно ничего не "поимеем", и в этом в случае падения клиента.... Я просто думаю, сможет ли клиент "успеть" за поступающими данными при работе с IB?..Успеет ли он(клиент) затолкать запись в таблицу до поступления новых данных... особенно, при интенсивном поступлении данных и уже приличных накопленных данных.. На счет дискового пространства (1) и размера БД(2) - можно диск приличный воткнуть(1) и создать многофайловую БД (2)... Теоретически для IB было 131 тБ для 8к страницы, если мне память не изменяет..


Sergey13   (2005-10-04 10:01:00) [17]

2[36] Андрей Жук ©   (03.10.05 18:20)
А чем это сильно плохо?


jack128   (2005-10-03 20:16:00) [18]

ANB ©   (03.10.05 17:44) [35]
но выигрыш довольно мал, а граблей довольно много.

какие грабли могут быть в
IBTransaction.StartTransaction;
try
 for i := 0 to Buffer.Count - 1 do
 begin
   SetSQLParams(IBSQL, Buffer[i]);
   IBSQL.ExecQuery;
 end;
finally
 IBTransaction.Commit;
end;

?


Андрей Жук   (2005-10-03 18:20:00) [19]


> ЗЫ. А таки работа с транзакциями в оракле мне больше
> всего нравится.

Особенно невозможность сделать COMMIT в теле процедуры...


ANB   (2005-10-03 17:44:00) [20]


> Курдль ©   (03.10.05 16:53) [34]
- не то, чтобы очень напрягает, наоборот, коммит каждые, например, 1000 записей дает даже небольшой выигрыш по времени, но выигрыш довольно мал, а граблей довольно много. В общем ты в основе - прав. Если транзакции особо не нужны, нет смысла упрямо пытаться везде, где только можно их впихнуть. Исключение - случай, когда они действительно нужны.

ЗЫ. А таки работа с транзакциями в оракле мне больше всего нравится.


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

Наверх

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