Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
09.08.2016, 13:21
|
|||
---|---|---|---|
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
Доброго времени суток! Продолжая эпопею сражения с базой столкнулся (уже в который раз) с очередной проблемой. Итак. Идет непрерывная запись в базу. С интервалом 50-60 мсек. записывается в 24 таблицы несколько параметров. Смотреть пост выше. http://www.sql.ru/forum/1221128/ispolzovanie-odnogo-fdquery-select-dlya-polucheniya-dannyh-iz-raznyh-tablic При этом я одновременно читаю данные из ранее созданных или актуально записываемой базы .И всё бы ничего ,но во время чтения данных запись подтормаживает на 3-4 секунды. получаются пропуски в записи. При чтении максимального колличества инфы. а именно 24 таблицы все данные записанные в течении суток с интервалом в 60 мсек. прога рисует графики на основании выборки. и одновременно продолжает писать .Но .. с пропусками. Используются для записи и чтения разные конекты FDConection параметрыэтих конектов jmWAL . LockingMode-lmExclusive. TxOption Auto->Commit.Start.End Pooled - false Synchronaus - snNormal. что упустил тут же добавлю. ПРОШУ помощи спецов в корректировке. С ув. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.08.2016, 13:26
|
|||
---|---|---|---|
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
komvik, if (Фсевотпуске) { явыгноре;} else { есинеттошотада} ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.08.2016, 16:11
|
|||
---|---|---|---|
|
|||
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
WAL предполагает ведение журнала, в который прописываются изменения БД. Читающая транзакция запоминает позицию последнего commit'а в журнале на момент старта и игнорирует все записи в журнал после этой позиции, т.е. имеем Concurrency-изоляцию (snapshot). Значит, читающая транзакция не увидит изменений, вносимых после её старта, это раз. Читать из журнала разрешается параллельно с записью в него, теряться при этом ничего не будет. Запись в журнал сериализуется (допускается только одна пишущая транзакция в каждый момент времени). У Вас один главный поток на всё приложение. В этом случае трудно гарантировать параллельную с чтением запись через фиксированный интервал времени. При долгом чтении некому будет сохранять данные. Нужен дополнительный пишущий, или буферизующий данные для записи поток, это два. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.08.2016, 17:30
|
|||
---|---|---|---|
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
MrCat, добрая душа откликнулась! А тепей сейёзно.Как говаривал Мих.Михалыч. MrCatWAL предполагает ведение журнала, в который прописываются изменения БД. Читающая транзакция запоминает позицию последнего commit'а в журнале на момент старта и игнорирует все записи в журнал после этой позиции, т.е. имеем Concurrency-изоляцию (snapshot). Значит, читающая транзакция не увидит изменений, вносимых после её старта, это раз. меня вполне это устраивает читаться должно от.. и до момента выборки.(актуального файла). Но проблема что в моменты открытия конекта на чтение запись залипает на 3 сек. и в прцессе чтения таблиц и рисования графика тоже. есть ли где справочка или кусок кода как мне эту ..тень распаралеллить. буду очень гран мерси и плюсовать вашу карму программиста. с ув. Виктор ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.08.2016, 17:59
|
|||
---|---|---|---|
|
|||
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
Ну как распараллелить. CreateThread() там, своя StartRoutine для записи, свой компонент соединения в контексте потока, который не дёргается из основного потока, вот это вот всё. Только, чур, не делегировать запись основному потоку (через отсылку сообщений), ни-ни. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.08.2016, 18:06
|
|||
---|---|---|---|
|
|||
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
Я бы даже сделал два доп. потока - на опрос устройств и буферизацию данных и на запись буфера в БД. Каждые 50 мс = 20 Гц, можно накапливать по сотне записей за 5 секунд в буфере, а потом разово записывать этот буфер в БД с помощью параметризованного запроса. Так и не понял, кстати, зачем там 12/24 таблиц, если у них поля совпадают, но ладно, пусть. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.08.2016, 18:40
|
|||
---|---|---|---|
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
MrCat, всё банально упирается в незнание матчасти. отсутсвии народа с нормальными советами в какую сторону рыть. итд в общем мне бы толково ктонить разьяснил. да нет таких.можно отослать в доки читать. но конкретезировать короче первый блин....даже не комом да. Спасибо за поддержку. + + + + + + всё в карму. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.08.2016, 19:08
|
|||
---|---|---|---|
|
|||
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
Доки раз , доки два . Первое - про потоки в целом, из второго следует прочесть о событиях, и о WaitForSingleObject. Этого достаточно, чтобы создать и синхронизировать два потока. Первый опрашивает устройства каждые 50 секунд (использовать WaitForSingleObject() == WAIT_TIMEOUT события, которое никогда не наступит, для паузы между опросами) и записывает данные опроса в буфер (массив или список объектов/структур - как удобнее). Если буфер заполнен, он быстро передаётся второму потоку (через установку второго события), после чего первый поток делает себе новый буфер, а про старый забывает. Второй поток вечно ждёт второе событие с автоспуском оного. Среагировав на событие, он заносит данные из полученного буфера в БД, после чего уничтожает буфер. Для записи в БД используются компоненты, созданные внутри второго потока, а не визуальные компоненты с формы. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.08.2016, 19:14
|
|||
---|---|---|---|
|
|||
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
Да, для надёжности второй поток должен не просто принимать буфер, а помещать принятые буфера в LIFO-список, с разумным ограничением на размер - например, 10 или 100 буферов максимум. Соответственно, в своей поточной функции он в цикле, пока список буферов не пуст, побуферно записывает информацию в БД. Использованные буфера из списка удаляются и уничтожаются. Поскольку к списку буферов будут обращаться два потока (первый и второй), понадобится простая быстрая синхронизация, например, с помощью критической секции. Про критические секции у Рихтера тоже очень хорошо всё расписано. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.08.2016, 19:16
|
|||
---|---|---|---|
|
|||
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
* FIFO-список, разумеется. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.08.2016, 10:58
|
|||
---|---|---|---|
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
MrCat, Очень признателен за советы! Не всё в этой проге так тривиально. Прога досталась от стороннего разработчика и я её допиливаю по потребностям фирмы. Первое, у меня работают два таймера которые в режиме тригера пишут в базу. Каждый таймер ожидает своё устройство. Второе, данные поступают в виде массива данных который в цикле до 300 вызывает каждый раз функцию записи в базу и пишет туда строку. Пока таймер не закончит работу он не переключится на второй итд. чтение я засунул в отдельный поток но не синхронизировал его с таймерами. не знаю как. Вот собсна кратенько. Если возникнет интерес или желание поправить код буду очень благодарен и распишу всё поподробнее. Я в потоках не профи как собственно и базах. Знаю много, читал, простенькое клепал, но сейчас как то сложновато. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.08.2016, 14:29
|
|||
---|---|---|---|
|
|||
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
Можно и код посмотреть, кидайте его сюда под спойлер. Как минимум, обработчик OnTimer и код читающего потока. А ещё лучше - всё целиком. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.08.2016, 15:11
|
|||
---|---|---|---|
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
MrCat, Два вопроса 1 Под, пардон спойлер, куда кидайте? 2 Могу ли я вам латиницей/транслитом писать, а то виртуальную клаву использовать тяжело. Пы.Сы Есть ли возможность только вам код показать. А то фирма немецкая ,права пользователя, защита по, и вся такая дребидень. Мне побарабану но начальство по голове не погладит.А может есче и стукнет. Не хотелось бы светить на всю сеть. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.08.2016, 15:51
|
|||
---|---|---|---|
|
|||
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
Движок сайта умеет выпарсивать из сообщений тэги в формате [имя_тэга]...[/имя_тэга] и оформлять по ним сообщение. Тэг spoiler убирает под кат всё, что располагается на месте троеточия. Из кода можно повыдёргивать весь контент, относящийся к специфике - к конкретному устройству, структуре БД, путям соединения с ней, текстовому наполнению формы, и т.д. Выкладывать лучше сюда, т.к. чем больше человек увидит код, тем легче будет найти в нём ошибку. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.08.2016, 16:03
|
|||
---|---|---|---|
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
MrCat, Ok zavtra vse podgotovlju i objazatelno vilogu s objasnenijami. Da. normalno esli translit? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.08.2016, 16:10
|
|||
---|---|---|---|
|
|||
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
Нормально. Читабельно. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
12.08.2016, 11:10
|
|||
---|---|---|---|
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
MrCat, Vrode vse podgotovil. Vchera sprosil shefa mogno li vilogit chast code poluchil net. Poetomu popitalsja vibrosit vse ne otnosjasheesja k teme. Esli chto ne dopisal ili vozniknut voprosi ja pojasnu. Da!! vchera voznikla problemma opredelit razmer file bazi dannich s pomoschju Firedac. Pochitav docu ponjal chto na prjamuju poluchit razmer.Nelzja. Moget est kakaja nibud hitrost poluchit razmer ACTUALNOJ ! bazi Zadacha stoit ogranichit razmer napisanija file. Esli previshaet dopustimij to sozdaetsja novij file. Da.Teper code. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
12.08.2016, 11:15
|
|||
---|---|---|---|
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
MrCat, ... |
|||
:
Нравится:
Не нравится:
|
|||
|
12.08.2016, 11:18
|
|||
---|---|---|---|
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
MrCat, ... |
|||
:
Нравится:
Не нравится:
|
|||
|
12.08.2016, 11:18
|
|||
---|---|---|---|
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
MrCat, ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.08.2016, 10:01
|
|||
---|---|---|---|
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
komvik, Ты так и не стал использовать bind переменные... это от лени, или не понял как это делается? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.08.2016, 15:11
|
|||
---|---|---|---|
|
|||
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
Насколько я понял, чтение ведётся во втором потоке, который в хвост и в гриву использует визуальные компоненты в своём контексте. Это опасно, во-первых, несогласованностью доступа (что случится, если второй поток попытается записать в диаграмму, удалённую или очищенную первым потоком?). Кроме того, запись, которая ведётся при обработке сообщения таймера в главном потоке, конкурирует с кучей других сообщений, из-за чего и могут появляться пропуски. Т.е. желательно переделать так, как я рекомендовал выше - чтение из БД и заполнение Chart - в главном потоке, опрос устройств и запись в БД - в отдельном, а лучше - в двух отдельных. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.08.2016, 09:52
|
|||
---|---|---|---|
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
PPA, Naprotiv. Ja poproboval ispolzovat i dage resultat bil neplohim. Odnako ne ja reshaju strategiju programmi ja lish ispolnitel.i vse probi i oshibki prihoditsja soglasovivat s Shefom. J aiznachalno sovershil strategicheskuju oshibku sozdavaja fajl v SQLIte. Nado bilo prosto pisat v Binarnij File kak v odnom iz postov mne zdes "Sovetoval" White Owl. No ja sovershil ogromnuju oshibku poschitav chto Basa dannich SQLite javljaetsja temchto nado. Po neznaniju, i nevozmognostju posovetovatsja s kem libo.Plus faktor vremeni. Teper rashljobivaju i dumaju po golove menja za eto ug tochno ne pogladjat. kak to tak. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.08.2016, 10:02
|
|||
---|---|---|---|
Частичная потеря записываемых данных при синхронной запись/чтение |
|||
#18+
MrCat, K moemu ogromnomu sogaleniju ne ja reshaju chto i kak delat Proga iznachalno bila nekorektno sostavlenna a tem bolee ne gotova k takim doveskam. plus moja strategicheskaja oshibka ispolzovat bazu dannich SQLite. Vse dobavljaetsja i dobavljaetsja i budet dobavljatsja. V samom nachale bil odin tajmer i odno ustrojstvo tolko na chtenie s minimalnim ispolzovaniem TChart. Potom sdelali Zerkalnuju kopiju i privintili vtoroe ustrojstvo. I v konze reshili vesti i zapis a potom esche i sinhronno pokazivat. koroshe pod dejstviem takogo parovoza vse nachalo medlenno zagibatsja. Vremeni strategicheski chto to menjat net. Da i gelanija osobogo nachalstvo ne projavljaet. vot i prihoditsja mutit chto samo po sebe v korne neverno. Vot tak. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=54&mobile=1&tid=2008578]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
26ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 264ms |
total: | 388ms |
0 / 0 |