Уважаемые знатоки, подскажите как лучше поступить...

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
oleg0506
Сообщения: 5
Зарегистрирован: 19 мар 2011, 01:05

Уважаемые знатоки, подскажите как лучше поступить...

Сообщение oleg0506 » 20 мар 2011, 00:55

Суть задачи:
в БД FireBird есть таблица - она содержит 500 000 записей...
работает 10-20 параллельных потоков, каждый из которых делает следующее:
выполняет поиск по этой таблице (с помощью LIKE - т.е. неточное совпадение) определенного значения и если ничего не найдено то добавляет в ЭТУ ЖЕ БД новую
строку!
т.е. в единый момент времени одновременно несколько потоков работают с одной и той же таблицей,
причем, одни из них выполняют по ней Select LiKE а другие делают INSERT INTO в нее же...

в связи с этим основной вопрос: как это лучше реализовать?

ДУМАЮ ПОСТУПИТЬ ТАК:
динамически, в run-time, создавать для каждого потока собственные объекты tFIBDatabase, tFIBTransaction и tFIBQuery
и все они параллельно коннектятся в БД и работают с ней...

будет ли так все работать?
не возникнет ли каких-либо конфликтов доступа к таблице(ам) между потоками?
обязательно ли обращаться к компонентам FibPlus из потоков из секции синхронизации? Нужны ли критические секции в потоках?
не получу ли я вместо увеличения скорости - замедления работы программы в целом?
в общем, на какие грабли я могу наступить?)

и есть ли более правильный способ решения?
(просто немного смущает, что каждому потоку постоянно придется выполнять, по сути,
один и тот же SELECT LIKE (меняется только искомая строка)... понятно, что в запрос надо ввести параметр и выполнить Prepare, а потом
просто в параметр подставлять новую искомую строку и повторять запрос... Но может, возможно как-то еще сильнее
оптимизировать этот процесс?)

kdv
Forum Admin
Сообщения: 6575
Зарегистрирован: 25 окт 2004, 18:07
Контактная информация:

Re: Уважаемые знатоки, подскажите как лучше поступить...

Сообщение kdv » 20 мар 2011, 17:52

будет ли так все работать?
будет
не возникнет ли каких-либо конфликтов доступа к таблице(ам) между потоками?
каких? 10 коннектов, это как 10 разных приложений. Могут 10 разных приложений читать данные и одновременно добавлять записи? Разумеется, могут.
обязательно ли обращаться к компонентам FibPlus из потоков из секции синхронизации?
не понял, зачем синхронизация, если каждый поток работает со своим коннектом, то синхронизация не нужна (см. выше).
Вообще по FIBPlus техподдержка у них на сайте. Про параллельную работу из тредов через IBX написано тут:
www.ibase.ru/devinfo/ibx.htm
и есть ли более правильный способ решения?
более правильный - это как? Например я скажу, что более правильно не морочить голову с тредами, а запустить одно и то же приложение нужное число раз, вы посчитаете это более правильным?
Но может, возможно как-то еще сильнее оптимизировать этот процесс?
так отсюда не видно, зачем вы этим like долбите сервер, да еще из разных тредов. Если этот самый like для каждого треда возвращает разный результат, то в чем вопрос?

TAV
Сообщения: 48
Зарегистрирован: 31 май 2005, 08:18
Откуда: Челябинск

Re: Уважаемые знатоки, подскажите как лучше поступить...

Сообщение TAV » 31 мар 2011, 19:46

Интересная ситуация про потоки.
Может случится так что LIKE вернет вам несколько записей - что тогда?
А можно подробнее какую задачу выполняет ваше приложение?

oleg0506
Сообщения: 5
Зарегистрирован: 19 мар 2011, 01:05

Re: Уважаемые знатоки, подскажите как лучше поступить...

Сообщение oleg0506 » 02 апр 2011, 00:40

подробнее о задаче:
Eсть 10 удаленных филиалов... на каждом из них формируется особый файлик со списком значений...(пример содержания: FGH1623a5st674713, PTR217dd4587x21ST, BDT2378z45aaTTA и т.п.)
Есть сервер, на нем работает FireBird с БД (локальная, но доступ к ней осуществляется через TCP-IP т.е. как localhost:c:\.. .\myBase.FDB ) и
Программа - которая делает следующее:
запускает 10 коннектов к разным удаленным серверам (для каждого - отдельный поток). С каждого из них она получает определенное значение, которое нужно проверить по БД (FireBird) и если такого значения в БД еще нет - добавляет его в бд!
Таким образом на FireBird формируется ОБЩАЯ БД уникальных значений...

структурно работа (каждого из потоков) выглядит так:
1. Поток соединяется со своим (1 из 10) сервером и получает от него Новое значение для проверки...
2. Соединяется с БД FireBird и делает LIKE по его ОБЩЕЙ БД, на предмет проверки - нет ли уже в ней такой записи (проверка делается именно через LIKE т.к. префикс и постфикс бывают разные, а на данном этапе важна только центральная кодовая часть)
3. Если LIKE вернул кол-во = 0 то запись добавляется в БД, иначе - делается новый запрос на удаленный сервак и с него получается новое значение для проверки... (далее - goto 1)))

предвижу вопрос -
зачем каждый раз обращаться на удаленный сервер за новым значением? не лучше ли сразу запросить целым списком и потом сразу его весь проверить с помощью IN (значение1, значение2, ...)
Отвечаю - такова специфика работы удаленных машин... когда у них появится новая запись - заранее неизвестно...(на одной они могут появляться каждые 20 сек, на другой 1 раз в час) так что после каждой проверки по БД (с помощью LIKE) поток сразу же снова обращается на удаленный сервак с вопросом: «есть ли еще что-нибудь для проверки или нет? --- и если нет, то просто засыпает и ждет пока для него не появится работка...))
(прим: допускается некоторая избыточность данных в БД. Главное - чтобы такая запись была в БД (хоть в одном экземпляре, хоть в двух, трех) и больше не добавлялась другими потоками... т.е. неважно сколько записей вернул LIKE... если >0 значит такая запись уже есть в БД и добавлять не надо, иначе - добавить. Кроме того, периодически (раз в неделю, стартует специальная утилита кот. удаляет из БД FireBird все повторы...)

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1427
Зарегистрирован: 15 сен 2005, 09:05
Откуда: Krupka
Контактная информация:

Re: Уважаемые знатоки, подскажите как лучше поступить...

Сообщение Dimitry Sibiryakov » 02 апр 2011, 14:28

Гораздо больше меня интересует вопрос: какие были основания спроектировать денормализованную таблицу?.. С ростом количества данных оно сдохнет.

oleg0506
Сообщения: 5
Зарегистрирован: 19 мар 2011, 01:05

Re: Уважаемые знатоки, подскажите как лучше поступить...

Сообщение oleg0506 » 02 апр 2011, 16:48

прстите, а в чём денормализация?) в БД всего 1 таблица в которой всего 1 поле... не представляю как еще ее можно нормализовать...))

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1427
Зарегистрирован: 15 сен 2005, 09:05
Откуда: Krupka
Контактная информация:

Re: Уважаемые знатоки, подскажите как лучше поступить...

Сообщение Dimitry Sibiryakov » 03 апр 2011, 14:23

Первая нормальная форма запрещает пихать несколько сущностей в одно поле. Раздели его на три: префикс, кодовую часть и постфикс. После чего сможешь сравнивать кодовую часть на равенство, наложить на неё ограничение уникальности и вообще воспользоваться результатами этого теста.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя