Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Частичная потеря записываемых данных при синхронной запись/чтение / 24 сообщений из 24, страница 1 из 1
09.08.2016, 13:21
    #39288874
komvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
Доброго времени суток!
Продолжая эпопею сражения с базой столкнулся (уже в который раз) с очередной проблемой.
Итак.
Идет непрерывная запись в базу. С интервалом 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.

что упустил тут же добавлю.
ПРОШУ помощи спецов в корректировке.
С ув.
...
Рейтинг: 0 / 0
10.08.2016, 13:26
    #39289662
komvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
komvik,
if (Фсевотпуске) { явыгноре;}
else { есинеттошотада}
...
Рейтинг: 0 / 0
10.08.2016, 16:11
    #39289825
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
WAL предполагает ведение журнала, в который прописываются изменения БД. Читающая транзакция запоминает позицию последнего commit'а в журнале на момент старта и игнорирует все записи в журнал после этой позиции, т.е. имеем Concurrency-изоляцию (snapshot). Значит, читающая транзакция не увидит изменений, вносимых после её старта, это раз.

Читать из журнала разрешается параллельно с записью в него, теряться при этом ничего не будет. Запись в журнал сериализуется (допускается только одна пишущая транзакция в каждый момент времени). У Вас один главный поток на всё приложение. В этом случае трудно гарантировать параллельную с чтением запись через фиксированный интервал времени. При долгом чтении некому будет сохранять данные. Нужен дополнительный пишущий, или буферизующий данные для записи поток, это два.
...
Рейтинг: 0 / 0
10.08.2016, 17:30
    #39289902
komvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
MrCat, добрая душа откликнулась!
А тепей сейёзно.Как говаривал Мих.Михалыч.


MrCatWAL предполагает ведение журнала, в который прописываются изменения БД. Читающая транзакция запоминает позицию последнего commit'а в журнале на момент старта и игнорирует все записи в журнал после этой позиции, т.е. имеем Concurrency-изоляцию (snapshot). Значит, читающая транзакция не увидит изменений, вносимых после её старта, это раз.
меня вполне это устраивает читаться должно от.. и до момента выборки.(актуального файла).

Но проблема что в моменты открытия конекта на чтение запись залипает на 3 сек. и в прцессе чтения таблиц и рисования графика тоже.

есть ли где справочка или кусок кода как мне эту ..тень распаралеллить.
буду очень гран мерси и плюсовать вашу карму программиста.

с ув. Виктор
...
Рейтинг: 0 / 0
10.08.2016, 17:59
    #39289920
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
Ну как распараллелить. CreateThread() там, своя StartRoutine для записи, свой компонент соединения в контексте потока, который не дёргается из основного потока, вот это вот всё. Только, чур, не делегировать запись основному потоку (через отсылку сообщений), ни-ни.
...
Рейтинг: 0 / 0
10.08.2016, 18:06
    #39289925
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
Я бы даже сделал два доп. потока - на опрос устройств и буферизацию данных и на запись буфера в БД. Каждые 50 мс = 20 Гц, можно накапливать по сотне записей за 5 секунд в буфере, а потом разово записывать этот буфер в БД с помощью параметризованного запроса. Так и не понял, кстати, зачем там 12/24 таблиц, если у них поля совпадают, но ладно, пусть.
...
Рейтинг: 0 / 0
10.08.2016, 18:40
    #39289956
komvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
MrCat,

всё банально упирается в незнание матчасти. отсутсвии народа с нормальными советами в какую сторону рыть.
итд в общем мне бы толково ктонить разьяснил. да нет таких.можно отослать в доки читать. но конкретезировать короче первый блин....даже не комом

да. Спасибо за поддержку. + + + + + + всё в карму.
...
Рейтинг: 0 / 0
10.08.2016, 19:08
    #39289974
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
Доки раз , доки два .

Первое - про потоки в целом, из второго следует прочесть о событиях, и о WaitForSingleObject. Этого достаточно, чтобы создать и синхронизировать два потока. Первый опрашивает устройства каждые 50 секунд (использовать WaitForSingleObject() == WAIT_TIMEOUT события, которое никогда не наступит, для паузы между опросами) и записывает данные опроса в буфер (массив или список объектов/структур - как удобнее). Если буфер заполнен, он быстро передаётся второму потоку (через установку второго события), после чего первый поток делает себе новый буфер, а про старый забывает. Второй поток вечно ждёт второе событие с автоспуском оного. Среагировав на событие, он заносит данные из полученного буфера в БД, после чего уничтожает буфер. Для записи в БД используются компоненты, созданные внутри второго потока, а не визуальные компоненты с формы.
...
Рейтинг: 0 / 0
10.08.2016, 19:14
    #39289976
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
Да, для надёжности второй поток должен не просто принимать буфер, а помещать принятые буфера в LIFO-список, с разумным ограничением на размер - например, 10 или 100 буферов максимум. Соответственно, в своей поточной функции он в цикле, пока список буферов не пуст, побуферно записывает информацию в БД. Использованные буфера из списка удаляются и уничтожаются. Поскольку к списку буферов будут обращаться два потока (первый и второй), понадобится простая быстрая синхронизация, например, с помощью критической секции. Про критические секции у Рихтера тоже очень хорошо всё расписано.
...
Рейтинг: 0 / 0
10.08.2016, 19:16
    #39289979
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
* FIFO-список, разумеется.
...
Рейтинг: 0 / 0
11.08.2016, 10:58
    #39290173
komvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
MrCat,
Очень признателен за советы!
Не всё в этой проге так тривиально.
Прога досталась от стороннего разработчика и я её допиливаю по потребностям фирмы.

Первое, у меня работают два таймера которые в режиме тригера пишут в базу.
Каждый таймер ожидает своё устройство.

Второе, данные поступают в виде массива данных который в цикле до 300
вызывает каждый раз функцию записи в базу и пишет туда строку.

Пока таймер не закончит работу он не переключится на второй итд.

чтение я засунул в отдельный поток но не синхронизировал его с таймерами. не знаю как.

Вот собсна кратенько.
Если возникнет интерес или желание поправить код буду очень благодарен и распишу всё поподробнее.

Я в потоках не профи как собственно и базах. Знаю много, читал, простенькое клепал, но сейчас как то сложновато.
...
Рейтинг: 0 / 0
11.08.2016, 14:29
    #39290344
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
Можно и код посмотреть, кидайте его сюда под спойлер. Как минимум, обработчик OnTimer и код читающего потока. А ещё лучше - всё целиком.
...
Рейтинг: 0 / 0
11.08.2016, 15:11
    #39290377
komvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
MrCat,

Два вопроса
1 Под, пардон спойлер, куда кидайте?
2 Могу ли я вам латиницей/транслитом писать, а то виртуальную клаву использовать тяжело.
Пы.Сы Есть ли возможность только вам код показать. А то фирма немецкая ,права пользователя, защита по, и вся такая дребидень.

Мне побарабану но начальство по голове не погладит.А может есче и стукнет.
Не хотелось бы светить на всю сеть.
...
Рейтинг: 0 / 0
11.08.2016, 15:51
    #39290409
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
Движок сайта умеет выпарсивать из сообщений тэги в формате [имя_тэга]...[/имя_тэга] и оформлять по ним сообщение. Тэг spoiler убирает под кат всё, что располагается на месте троеточия. Из кода можно повыдёргивать весь контент, относящийся к специфике - к конкретному устройству, структуре БД, путям соединения с ней, текстовому наполнению формы, и т.д. Выкладывать лучше сюда, т.к. чем больше человек увидит код, тем легче будет найти в нём ошибку.
...
Рейтинг: 0 / 0
11.08.2016, 16:03
    #39290430
komvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
MrCat,
Ok zavtra vse podgotovlju i objazatelno vilogu s objasnenijami.

Da. normalno esli translit?
...
Рейтинг: 0 / 0
11.08.2016, 16:10
    #39290435
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
Нормально. Читабельно.
...
Рейтинг: 0 / 0
12.08.2016, 11:10
    #39290855
komvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
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.
...
Рейтинг: 0 / 0
12.08.2016, 11:15
    #39290864
komvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
MrCat,
...
Рейтинг: 0 / 0
12.08.2016, 11:18
    #39290869
komvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
MrCat,
...
Рейтинг: 0 / 0
12.08.2016, 11:18
    #39290871
komvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
MrCat,
...
Рейтинг: 0 / 0
15.08.2016, 10:01
    #39291758
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
komvik,

Ты так и не стал использовать bind переменные...
это от лени, или не понял как это делается?
...
Рейтинг: 0 / 0
15.08.2016, 15:11
    #39292036
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
Насколько я понял, чтение ведётся во втором потоке, который в хвост и в гриву использует визуальные компоненты в своём контексте. Это опасно, во-первых, несогласованностью доступа (что случится, если второй поток попытается записать в диаграмму, удалённую или очищенную первым потоком?). Кроме того, запись, которая ведётся при обработке сообщения таймера в главном потоке, конкурирует с кучей других сообщений, из-за чего и могут появляться пропуски.

Т.е. желательно переделать так, как я рекомендовал выше - чтение из БД и заполнение Chart - в главном потоке, опрос устройств и запись в БД - в отдельном, а лучше - в двух отдельных.
...
Рейтинг: 0 / 0
16.08.2016, 09:52
    #39292389
komvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
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.
...
Рейтинг: 0 / 0
16.08.2016, 10:02
    #39292397
komvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичная потеря записываемых данных при синхронной запись/чтение
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.
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Частичная потеря записываемых данных при синхронной запись/чтение / 24 сообщений из 24, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]