Форум: "Базы";
Текущий архив: 2003.03.31;
Скачать: [xml.tar.bz2];
Вниз---|Ветка была без названия|--- Найти похожие ветки
← →
ki11er (2003-03-04 21:11) [0]приведенный ниже код валится через пару минут работы с сообщениями "Index is out of date" или "Insufficient Memory..." (при 256 оперативки и паре свободных гигах на винте ;-))))
При написании следовал советам, полученным в этой конференции, а так же из других источников. Можно ли написать подобный код так, чтобы он работал без глюков или это принципиально невозможно?
procedure TFormMain.FormCreate(Sender: TObject);
var i: integer;
str_tmp: string;
begin
StartDir := ExtractFilePath(Application.ExeName);
if StartDir[Length(StartDir)] <> "\" then begin
StartDir := StartDir + "\";
end;
sDirDB := StartDir + "dbase\";
CreateDir(sDirDB);
CreateDir(StartDir + "net");
Session.NetFileDir := StartDir + "net";
CreateDir(StartDir + "private");
str_tmp := StartDir + "private\" + IntToStr(GetTickCount);
CreateDir(str_tmp);
Session.PrivateDir := str_tmp;
tbTest.DatabaseName := sDirDB;
qrTest.DatabaseName := sDirDB;
btnStartStop.Caption := "
← →
ki11er (2003-03-05 10:54) [1]Никто что ли не знает, как правильно? Или не хотите секреты выдавать?
← →
WellSlava (2003-03-05 11:09) [2]Сколько записей в базе?
← →
ki11er (2003-03-05 11:15) [3]Посмотрите, внимательно на код ;-)
Таблица создается при старте программы (перед стартом я все удаляю).
Одно уточнение, в соответствии с хелпом заменил строку
Session := TSession.Create(nil);
на
_FSession := Sessions.OpenSession("Session" +
IntToStr(integer(@_FSession)) +
IntToStr(GetTickCount));
Но это ничего не изменило. ;-(((
← →
MsGuns (2003-03-05 11:25) [4]Бог мой, а накручено-то !
Скажи, пжлста, какой великий смысл каждый раз при запуске создавать БД ? А где проверка, что она уже создана ?
Во-вторых, прежде чем манипулировать TSession советую заюзать TDatabase, создавть алиас, куда загонять нужные параметры для формата Парадокс (рекомендую TSession.AddStandardAlias)
А, главное, не понятен СМЫСЛ всей этой байды (многопоточное чтение одной только что созданной таблы)
← →
ki11er (2003-03-05 11:40) [5]2 MsGuns:
Если вы не можете отличить запись от чтения, думаю, вряд ли сможете помочь в данном случае.
Этот код - просто тест. И его великий смысл проверить все, что тут и в других местах говорится на практике.
> Во-вторых, прежде чем манипулировать TSession советую заюзать
> TDatabase
Это из личного опыта или где-то документировано?
← →
MsGuns (2003-03-05 12:21) [6]>ki11er (05.03.03 11:40)
>Если вы не можете отличить запись от чтения, думаю, вряд ли сможете помочь в данном случае.
Отличить могу. В данном случае "чтение" просто описка. Имелось в виду слово "обращение". Если же не нужна моя помощь, то нет проблем.
>Это из личного опыта или где-то документировано
Это "документировано" в многочисленных хэлпах и примерах в книжках. Использование этой компоненты избавляет от многих проблем, в частности необходимость "движку" указывать ТИП и ВЕРСИЮ формата, путь ко ВСЕМ ипользуемым таблицам и запросам и т.д. Кроме того, через методы TDataBase (и ему подобных для SQL-серверных БД типа IB) можно получать и делать много чего полезного. Например, узнавить состав и структуры таблиц, блокировать ВСЕ таблицы за раз и т.д.
Прежде чем хаить кого бы то ни было за то, что он, По Вашему мнению, не ПОМОГ В ДАННОЙ КОНКРЕТНОЙ СИТУАЦИИ (типа не сказал в какой строке кода ошибка), советую все же почитать о TDatabase, особенно если Вы работаете с BDE и парадоксом
И не лишне все же было бы ответить на вопрос о необходимости распараллеливания доступа к ОДНОЙ И ТОЙ ЖЕ ТАБЛИЦЕ.
← →
ki11er (2003-03-05 12:49) [7]
> Отличить могу. В данном случае "чтение" просто описка. Имелось
> в виду слово "обращение". Если же не нужна моя помощь, то
> нет проблем.
ок. описка так описка. помощь нужна, иначе не постил бы ;-)
> советую все же почитать о TDatabase
да я почитал уже давно.
Use TDatabase when a BDE-based database application requires any of the following control over a database connection:
Persistent database connections
Customized database server logins
Transaction control
Application-specific BDE aliases
Ничего из этого списка в данном случае вроде не нужно? Или нужно?
Вы можете сказать _конкретно_, чем TDatabase поможет. Ну не люблю я советы типа "Попробуй это, авось что-нибудь получится"
А алиас я могу и через BDE Administrator добавить, только это вряд ли что-то изменит...
← →
MsGuns (2003-03-05 12:57) [8]Прочитал весь код ко конца и недоумение усилилось.
Создается ОДНО таблица с первичным ключем и 2-мя неуникальными индексами. Затем создается 11 (!!!) компонентов TTable, каждая из которых связывается с "личной" сессией, создаваемой тут же геморным способом (без обид), каждая со своим приват и в общий net каталоги. Затем на каждую таблу выполняется однотипное разовое действие (в коде - вставка ОДНОЙ И ТОЙ ЖЕ ЗАПИСИ !), после чего изменения "сохраняются" в таблицу. (В кавычках потому что если будет ttRead, то сохранение чего ?).
Наверное, есть в подобной технике что-то сермяжное, но я, убей, не пойму - НА ФИГА НАДО ОДЕВАТЬ ТРУСЫ ЧЕРЕЗ ГОЛОВУ ?
Что, нельзя создать 11 курсоров на ОДНУ И ТУ ЖЕ ТАБЛИЦУ в рамках одной сессии ? И сто, все 11 буду вот так одновременно писать в ОДНУ ТАБЛИЦУ ? Тогда почему нельзя сделать ОДНИМ запросом вставку (удпление/изменеие) ?
Короче - лес темный !
Да, и еще по поводу AutoInc. В парадоксе с этим типом полей, да еще определенным как ЕДИНСТВЕННЫЙ PK, следует работать чрезвычайно осторожно, т.к. в ПАРАДОКСЕ НЕТ ПОЛНОЦЕННЫХ ГЕНЕРАТОРОВ и BDE не гарантирует УНИКАЛЬНОСТЬ предоставляемого ею значения !
Особенно это опасно при одновременной вставке несколькими юзерами (у тебя-потоками)
← →
ki11er (2003-03-05 13:00) [9]Да, забыл...
> И не лишне все же было бы ответить на вопрос о необходимости
> распараллеливания доступа к ОДНОЙ И ТОЙ ЖЕ ТАБЛИЦЕ.
Вы имеете в виду, придумать задачу для которой это может понадобится? Думаю это не составит труда. А запись в таблицу - только частный случай. Вообще планировалось делать еще и другие операции (удаление, модификация ...). Но пока дело до этого не дошло, т.к. начало глючить в самом начале :-((((((((((
← →
ermserg (2003-03-05 13:05) [10]Session - globalnaya peremennaya, kotoraya sozdayotsa v initialization i razrushayetsa v finalization. Ti delayesh (11 raz!!!!):
Session := TSession.Create(nil);
Vopros: kakoy object budet razrushen v finalization, kogda budet razrushen object sozdanniy v initialization?
← →
MsGuns (2003-03-05 13:06) [11]>ki11er (05.03.03 13:00)
>Но пока дело до этого не дошло, т.к. начало глючить в самом начале :-((((((((((
И будет глючить. Т.к.невозможно придумать НОРМАЛЬНУЮ конструкцию автомобиля с квадратными колесами.
>придумать задачу для которой это может понадобится
Разве что придумать для нее спец. "квадратные" дороги ? :))))
← →
ki11er (2003-03-05 13:13) [12]
> Что, нельзя создать 11 курсоров на ОДНУ И ТУ ЖЕ ТАБЛИЦУ
> в рамках одной сессии ?
Use TSession to manage a group of database connections within an application. There are three uses for TSession: standard, multiple net files for Paradox, and multi-threaded database applications.
...
Finally, database applications that must establish multiple, concurrent connections to the same database, such as performing two queries against the same data at once, are multi-threaded applications. Multi-threaded applications must create and maintain one additional session component for each simultaneous connection to a single database server.
← →
MsGuns (2003-03-05 13:14) [13]>ermserg © (05.03.03 13:05)
Совершенно "в дырочку" !
В справке по этой переменной и соотв.компоненте так и написано, что разработчик сам несет всю ответственность за создание и уничтожение созданных им сессий.
Лично я вообще не видел пока необходимости создавать доп.сессии в приложении. Для оптимизации работы с БД (скорость, надежность и т.д.) существуют много других, гораздо более эффективных способов. Правда, если приложение работает с РАЗНЫМИ типами БД через BDE, то тогда, возможно, параллирование алгоритмики обмена с разными БД и имеет какой-то смысл. Но в приведенном примере вообще используется ЕДИНСТВЕННАЯ таблица. Какое распараллирование ? Для чего ? Типа разрезать бабушку и посмотреть что внутри ?
← →
ermserg (2003-03-05 13:23) [14]Posmotrel escho raz na kod i voprosov dobavilos:
1. Radi chego ti lovish Exception kogda sozdayosh tablitsu? Chto-b potom prodolzhit rabotu tak, budto ona suschestvuyet?
2. Gde razrushayutsa sozdanniye toboy 11 TSession?
← →
MsGuns (2003-03-05 13:27) [15]>ki11er (05.03.03 13:13)
Да-да-да. Именно так. Для конкурирующих коннектов. Т.е. если есть необходимость обращаться к одной и той же БД (не обязательно таблице - это могут быть разные таблицы, и не только таблицы, а, к примеру, ХП или представления), например из двух разных модулей приложения, то, чтобы они "не мешали" друг другу, заводим на каждую свою сессию, чтоб сервер их обслуживал параллельно (кстати, каждый мало-мальски нормальный сервер имеет понятие ТРАНЗАКЦИЯ, которое куда эффективей БДЕ-шной сессии).
Вопрос, какое это отношение имеет к Парадоксу ? У него нет СЕРВЕРА.
Читаем далее
multiple net files for Paradox
Предположив, что Вы знаете, что означает net-файл для парадокса, спрашиваю:
У вас что, несколько лицензионных версий Парадокса с группой своих юзеров для каждого ? Т.е.несколько БД, каждая из которых имеет свой net-файл и "своих" пользователей ? И Вам надо одновременно работать сразу с несколькими такими БД ? Если так, то из приведенного Вами кода этого не видно.
← →
MsGuns (2003-03-05 13:31) [16]>ermserg © (05.03.03 13:23)
Мое ИМХО: кадр разрезал бабушку, посмотрел, охренел. А теперь удивляется, почему бабушка не готовит ему обед ;)))))
← →
ki11er (2003-03-05 13:44) [17]
> Session - globalnaya peremennaya, kotoraya sozdayotsa v
> initialization i razrushayetsa v finalization. Ti delayesh
> (11 raz!!!!):
>
> Session := TSession.Create(nil);
...
>2. Gde razrushayutsa sozdanniye toboy 11 TSession?
Читаем _внимательно_ чуть выше:
ki11er (05.03.03 11:15)
...
Одно уточнение, в соответствии с хелпом заменил строку
Session := TSession.Create(nil);
на
_FSession := Sessions.OpenSession("Session" +
IntToStr(integer(@_FSession)) +
IntToStr(GetTickCount));
Следует, наверное сказать, что Seeeion при этом было переименовано в _FSession. А то опять глупые вопросы начнутся :-(
> 1. Radi chego ti lovish Exception kogda sozdayosh tablitsu?
> Chto-b potom prodolzhit rabotu tak, budto ona suschestvuyet?
В данном случае это несущественно.
← →
MsGuns (2003-03-05 13:48) [18]>ki11er (05.03.03 13:44)
>В данном случае это несущественно.
Смотрим бабушку дальше ?
← →
ki11er (2003-03-05 13:49) [19]
> И будет глючить. Т.к.невозможно придумать НОРМАЛЬНУЮ конструкцию
> автомобиля с квадратными колесами.
Имеется в виду, что на связке Delphi+BDE+Paradox это принципиально не должно работать? Тогда почему в хэлпах пишут, что должно?
← →
ermserg (2003-03-05 13:50) [20]> А то опять глупые вопросы начнутся
Eto hamstvo.
← →
ki11er (2003-03-05 13:55) [21]
> Прочитал весь код ко конца и недоумение усилилось.
> Создается ОДНО таблица с первичным ключем и 2-мя неуникальными
> индексами. Затем создается 11 (!!!) компонентов TTable,
> каждая из которых связывается с "личной" сессией, создаваемой
> тут же геморным способом (без обид), каждая со своим приват
> и в общий net каталоги.
Это не я придумал. "дэлфийный хэлп" + "a paradox table survival guid for c++ builder and delphi developers".
>Затем на каждую таблу выполняется
> однотипное разовое действие (в коде - вставка ОДНОЙ И ТОЙ
> ЖЕ ЗАПИСИ !),
Насчет одной и той же - это опять "описка"? ;-)
Хотя это не существенно, пусть даже и одной и той же...
> Да, и еще по поводу AutoInc. В парадоксе с этим типом полей,
> да еще определенным как ЕДИНСТВЕННЫЙ PK, следует работать
> чрезвычайно осторожно, т.к. в ПАРАДОКСЕ НЕТ ПОЛНОЦЕННЫХ
> ГЕНЕРАТОРОВ и BDE не гарантирует УНИКАЛЬНОСТЬ предоставляемого
> ею значения !
> Особенно это опасно при одновременной вставке несколькими
> юзерами (у тебя-потоками)
Я об этом знаю. Но опять же в данном случае это не существенно...
← →
MsGuns (2003-03-05 13:57) [22]>ki11er (05.03.03 13:49)
>Имеется в виду, что на связке Delphi+BDE+Paradox это принципиально не должно работать?
Оно МОЖЕТ работать в принципе. Но зачем ездить с квадратными колесами ? А уж если это делать, то совсем не так безбашенно, как в приведенном коде.
>Тогда почему в хэлпах пишут, что должно?
В хэлпах такого не пишут. Читай внимательнее. Пользуйся словарем для выбора всего спектра переводов слова, ТОЧНОГО смысла которого тебе не известно в данном контексте.
← →
ki11er (2003-03-05 13:58) [23]
> В справке по этой переменной и соотв.компоненте так и написано,
> что разработчик сам несет всю ответственность за создание
> и уничтожение созданных им сессий.
Это интересно в какой справке? В моей так написано:
Creates an instance of a TSession component.
Delphi syntax:
constructor Create(AOwner: TComponent);
Description
Do not call Create directly. The default session component, Session, is created automatically for all database applications. To create additional sessions for a multi-threaded database application at runtime call Sessions.OpenSession instead of Create. OpenSession calls Create only if the session does not already exist. (At design time, create additional sessions by dropping them on a data module.)
Destroys the instance of a session component.
Delphi syntax:
destructor Destroy;
Description
Do not call Destroy directly. For session components other than the default session, an application should call Free, which verifies that the session component is not nil before calling Destroy.
← →
Anatoly Podgoretsky (2003-03-05 14:03) [24]Учимся читать, а не копировать!
For session components other than the default session, an application should call Free, which verifies that the session component is not nil before calling Destroy.
← →
ki11er (2003-03-05 14:05) [25]
> Оно МОЖЕТ работать в принципе. Но зачем ездить с квадратными
> колесами ? А уж если это делать, то совсем не так безбашенно,
> как в приведенном коде.
Мда... интересное заявление. Еще рарз повторюсь, это придумал не я все сделано в соответствии с хэлпами. Если Вы где-то углядели несоответствие - буду рад, если Вы на него укажете. С удовольствием протестирую Ваш вариант код (только он должен делать то же самое теми же самыми средствами). Если он (Ваш код) будет более стабилен, опять же буду только рад и премного благодарен.
← →
ki11er (2003-03-05 14:11) [26]
> Eto hamstvo.
Не совсем так. Я мог бы сказать, что Session у меня - член класса и в соответствии с принципами ООП (да и не только ООП) именно он (а не глобальный) будет использоваться при выполнении тех операций, о которых шла речь.
← →
ki11er (2003-03-05 14:15) [27]
> Учимся читать, а не копировать!
> For session components other than the default session, an
> application should call Free, which verifies that the session
> component is not nil before calling Destroy.
Да, конечно. Сорри, погорячился. Но опять же это не важно в данном случае. Допустим никогда не разрушаются (хотя на самом деле разрушаются) - я запустил программу и пусть работает бесконечно (чего я и хочу добиться) ;-)
← →
ki11er (2003-03-05 14:18) [28]Единственный более-менее дельный совет из всей этой полемики - про TDatabase как-то замялся. Повторю вопрос тому, кто это предложил - так нужен он или нет? И если нужен, то для чего?
← →
ki11er (2003-03-05 15:50) [29]Неужели здесь не найдется человека, способного пролить свет на данный вопрос ? :-(((((((((((((((((((((((((((
← →
MsGuns (2003-03-05 15:51) [30]>ki11er (05.03.03 14:18)
>Повторю вопрос тому, кто это предложил - так нужен он или нет? И если нужен, то для чего?
Хамством такое замечание назвать было бы неверно, а вот невежлтвостью - однозначно. Если обращаемся к конкретному лицу, то воспитанные люди не употребляют силлогизмов типа "Тот, который" или "Тому, кто сказал".
По поводу TDatabase. Судя по всему, опыта и понимания принципов работы БД у тебя маловато. Имеется в виду прежде всего практический опыт, а не вычитанные из хелпов и принятые за руководство к действию фрагменты. Это я не к тому, чтобы "осадить", а к тому, что прежде чем начать реально программировать МНОГОПОТОЧНЫЕ обращения к БД, желательно более-менее разобраться с однопоточными. Может потом и необходимость в параллировании (а именно для этой цели, еще иногда называемой асинхронизацией, используются разные сессии) и отпадет.
Если уж используешь BDE, то начни с ВНИМАТЕЛЬНОГО изучения свойств, методов и событий, а также иерархии классов, соотв. Borland`ских компонент. Рекомендую такую посл-ть:
-TSession
-TDatabase
-TTable
-TQuery
-TBatchMove
и их предков: TDataSet, TDBDataSet, TBDEDataSet
а так же TField, TFieldDefs, TFieldDef
Я думаю, что после того, как эти вещи будут достаточно исследованы (именно исследованы, а не просмотрены), ты сам прекрасно ответишь на все свои вопросы.
С уважением.
← →
MsGuns (2003-03-05 15:52) [31]>ki11er (05.03.03 14:18)
>Повторю вопрос тому, кто это предложил - так нужен он или нет? И если нужен, то для чего?
Хамством такое замечание назвать было бы неверно, а вот невежлтвостью - однозначно. Если обращаемся к конкретному лицу, то воспитанные люди не употребляют силлогизмов типа "Тот, который" или "Тому, кто сказал".
Я не могу привести кода по той причине, что не умею писать проги, не зная ЧТО они должны делать.
По поводу TDatabase. Судя по всему, опыта и понимания принципов работы БД у тебя маловато. Имеется в виду прежде всего практический опыт, а не вычитанные из хелпов и принятые за руководство к действию фрагменты. Это я не к тому, чтобы "осадить", а к тому, что прежде чем начать реально программировать МНОГОПОТОЧНЫЕ обращения к БД, желательно более-менее разобраться с однопоточными. Может потом и необходимость в параллировании (а именно для этой цели, еще иногда называемой асинхронизацией, используются разные сессии) и отпадет.
Если уж используешь BDE, то начни с ВНИМАТЕЛЬНОГО изучения свойств, методов и событий, а также иерархии классов, соотв. Borland`ских компонент. Рекомендую такую посл-ть:
-TSession
-TDatabase
-TTable
-TQuery
-TBatchMove
и их предков: TDataSet, TDBDataSet, TBDEDataSet
а так же TField, TFieldDefs, TFieldDef
Я думаю, что после того, как эти вещи будут достаточно исследованы (именно исследованы, а не просмотрены), ты сам прекрасно ответишь на все свои вопросы.
С уважением.
← →
ki11er (2003-03-05 16:34) [32]
> Хамством такое замечание назвать было бы неверно, а вот
> невежлтвостью - однозначно. Если обращаемся к конкретному
> лицу, то воспитанные люди не употребляют силлогизмов типа
> "Тот, который" или "Тому, кто сказал".
Согласен и с тем и с другим. Просто при такой оживленной дискуссии сложно держать в голове кто, что сказал ;-)
> По поводу TDatabase. Судя по всему, опыта и понимания принципов
> работы БД у тебя маловато. Имеется в виду прежде всего практический
> опыт, а не вычитанные из хелпов и принятые за руководство
> к действию фрагменты. Это я не к тому, чтобы "осадить",
> а к тому, что прежде чем начать реально программировать
> МНОГОПОТОЧНЫЕ обращения к БД, желательно более-менее разобраться
> с однопоточными. Может потом и необходимость в параллировании
> (а именно для этой цели, еще иногда называемой асинхронизацией,
> используются разные сессии) и отпадет.
> Если уж используешь BDE, то начни с ВНИМАТЕЛЬНОГО изучения
> свойств, методов и событий, а также иерархии классов, соотв.
> Borland`ских компонент. Рекомендую такую посл-ть:
>
> -TSession
> -TDatabase
> -TTable
> -TQuery
> -TBatchMove
>
> и их предков: TDataSet, TDBDataSet, TBDEDataSet
>
> а так же TField, TFieldDefs, TFieldDef
>
> Я думаю, что после того, как эти вещи будут достаточно исследованы
> (именно исследованы, а не просмотрены), ты сам прекрасно
> ответишь на все свои вопросы.
Именно с этого я и начал ;-) Сначала изучил все, что мне было доступно. Потом написал код. Потом написал сюда ;-)
По-моему, вопрос достаточно конкретен. Мне не хотелось бы до бесконечности отвечать на "зачем?", "почему?", "для чего?" и т.п.
Вот код. Он не работает. Противоречий с документацией я не нахожу. Отсюда вопрос либо документация не правильная, либо я чего-то упустил... Поэтому и прошу помощи. Неужели данный вопрос никому не интересен?
Задача в целом такая:
1. Delphi, BDE, Paradox, таблица с индексами (первичный и несколько вторичных)
2. Из N потоков выполнять асинхронно добавление, изменение, удаление записей из одной таблицы через компонент TTable.
3. Из M потоков выполнять асинхронно добавление, изменение, удаление записей из одной таблицы через компонент TQuery.
4. 2 и 3 одновременно.
5. Программа должна работать без сбоев при условии, что компьютер не выключают при работающей программе.
А однопоточные варианты меня мало интересуют. ;-)
С уважением.
← →
MsGuns (2003-03-05 17:31) [33]В описании задачи не описал самое главное: КАК будкт добавляться/удаляться/изменяться записи
-юзерами с одной или нескольких ПК
-пакетно из других таблиц
-на основании других источников
Вот это и концептуально для выбора многопоточности.
В целом же для соблюдения П.5 BDE и особенно парадокс мало подходят. В SQL-серверном приложении потки в том смысле, что ты описал, выполняются не в приложении, а самим сервером. Посему разработчику надо лишь правильно прописать логику серверной части БД. Клиент же просто "делает, что хочет", не думая о том, что кто-то еще "лапает" его таблицы.
← →
sniknik (2003-03-05 17:51) [34]ki11er (05.03.03 16:34)
> 2. Из N потоков выполнять асинхронно добавление, изменение, удаление записей из одной таблицы через компонент TTable.
> 3. Из M потоков выполнять асинхронно добавление, изменение, удаление записей из одной таблицы через компонент TQuery.
> А однопоточные варианты меня мало интересуют. ;-)
зря надо бы чтобы интересовали (от простого к сложному так сказать),
сделай ПРОСТОЕ приложение, ну чтобы ничего не делало просто открывало 1 таблицу через BDE (из текушего пути), после раскопируй в 11 разных мест (чтобы таблици разные открывались) и запусти все. Удастся возвращайся сюда еще поспорить. Я лично делаю ставку на то что у тебя запущеных будет гдето 7-8, не больше.
← →
ki11er (2003-03-05 18:57) [35]
> В описании задачи не описал самое главное: КАК будкт добавляться/удаляться/изменяться
> записи
> -юзерами с одной или нескольких ПК
> -пакетно из других таблиц
> -на основании других источников
Так как это тест, то никаких юзеров не будет. добавляться/удаляться/изменяться будет соответствующими потоками (их поведение задается жестко при старте программы или в соответствии с настройками при нажатии кнопки "пуск". Например, первый, второй и третий добавляют случайно сгенеренные записи, четвертый - удаляет случайным образом выбранные записи и т.д.) Для простоты пусть только одна копия программы на локальном компьютере и таблица здесь же, на локальном диске.
2 sniknik:
> Удастся возвращайся сюда еще поспорить.
Думаю, что удастся, но ради очистки совести сейчас попробую...
> Я лично делаю ставку на то что у тебя запущеных будет гдето
> 7-8, не больше.
И какого размера ставка? ;-)))
А если серьезно, пусть будет даже 7, но _стабильно_работающих_ потока. Ограничение на количество я еще могу понять. Но пока что и 2 падают ;-(((
← →
BlackTiger (2003-03-05 20:14) [36]Влезу-ка я в эту "дискуссию".
Уважаемый ki11er! Во-первых, попрошу запомнить одну элементарную вещь - НЕТ РЕАЛЬНОЙ МНОГОПОТОЧНОСТИ НА ОДНО-ПРОЦЕССОРНОЙ МАШИНЕ!!!
Все есть простая эмуляция через квантование (20 мсек).
Во-вторых, если более подробнее поинтересоваться многопоточными DB-приложениями, то видно, что это оправдано ТОЛЬКО при длительных по времени запросах, чтобы во время ожидания выполнять еще какие-либо действия (есссесно с потерей производительности).
В-третьих, за 10 лет программирования НИ РАЗУ не приходилось использовать многопоточность в КЛИЕНТСКИХ приложениях.
В-четвертых, вся эта байда не имеетсмысла при работе с базами данных, которые имеют ограничение на количесво конкурирующих сессий (MSSQL,Oracle).
В-пятых, в АДО используется асинхронность запросов, а не многопоточность.
З.Ы. (без обид) А "пример" действительно дурацкий, и не имеющий применения в реальной жизни.
← →
ki11er (2003-03-05 21:33) [37]
> Уважаемый ki11er! Во-первых, попрошу запомнить одну элементарную
> вещь - НЕТ РЕАЛЬНОЙ МНОГОПОТОЧНОСТИ НА ОДНО-ПРОЦЕССОРНОЙ
> МАШИНЕ!!!
> Все есть простая эмуляция через квантование (20 мсек).
и истинное знание нам недоступно, ибо познанная истина ...
;-)))))))))))))))))
> В-третьих, за 10 лет программирования НИ РАЗУ не приходилось
> использовать многопоточность в КЛИЕНТСКИХ приложениях.
Во-первых, я разве говорил, что это клиентское приложение? Тыкните носом, где?
Во-вторых, если Вам не приходилось, это еще не значит, что никому не приходилось, не приходится и не придется.
MSSQL, Oracle, ADO и прочие подобные вещи - обсуждайте в другой ветке. Я не спорю и никогда не спорил, что все это круто. Но к обсуждаемой проблеме не имеет никакого отношения.
← →
ki11er (2003-03-05 21:42) [38]
> Уважаемый ki11er! Во-первых, попрошу запомнить одну элементарную
> вещь - НЕТ РЕАЛЬНОЙ МНОГОПОТОЧНОСТИ НА ОДНО-ПРОЦЕССОРНОЙ
> МАШИНЕ!!!
> Все есть простая эмуляция через квантование (20 мсек).
и истинное знание нам недоступно, ибо познанная истина ...
;-)))))))))))))))))
> В-третьих, за 10 лет программирования НИ РАЗУ не приходилось
> использовать многопоточность в КЛИЕНТСКИХ приложениях.
Во-первых, я разве говорил, что это клиентское приложение? Тыкните носом, где?
Во-вторых, если Вам не приходилось, это еще не значит, что никому не приходилось, не приходится и не придется.
MSSQL, Oracle, ADO и прочие подобные вещи - обсуждайте в другой ветке. Я не спорю и никогда не спорил, что все это круто. Но к обсуждаемой проблеме не имеет никакого отношения.
> З.Ы. (без обид) А "пример" действительно дурацкий, и не
> имеющий применения в реальной жизни.
Обид никаких...
Чтобы наконец остановить поток подобных вопросов и замечаний, вот пример из жизни:
Пусть есть некоторая железяка, с которой поступают асинхронно некоторые данные. Пусть частота поступления данных колеблется в пределах 20-80 секунд. Эти данные ложатся в таблицу. Параллельно с этим работает поток, который выбирает из этой таблицы данные по некоторым критериям посредством SQL-запроса, который выполняется например 1 минуту с индексами и 50 минут без индексов. Плюс есть локальный пользователь, который хочет просмотреть часть (отфильтрованную с помощью SQL-запроса) таблицы и возможно что-то в ней изменить, если захочет. Плюс есть точно такой же удаленный (пусть по локалке для простоты) юзер. Плюс есть поток, который просматривает таблицу, находит в ней по каким-то критериям записи и модифицирует их.
Достаточно? Или развить тему дальше?
ЛЮДИ! Давайте не будем выяснять, зачем, а? Лучше давайте сконцентрируемся на поиске проблемы.
Без обид ;-)))
← →
MsGuns (2003-03-05 22:11) [39]Попробую в последний раз.
>Во-первых, я разве говорил, что это клиентское приложение? Тыкните носом, где?
В сабже указано четко - формат Парадокс. Локалка в натуральном виде ! Это априори чисто КЛИЕНТСКИЙ ПОДХОД.
Объяснять разницу между локальной и клиент-серверной БД и, соответственно, ОГРОМЕННУЮ разницу в реализации доступа к данным ?
>Чтобы наконец остановить поток подобных вопросов и замечаний, вот пример из жизни:
Пусть есть некоторая железяка, с которой поступают асинхронно некоторые данные. Пусть частота поступления данных колеблется в пределах 20-80 секунд. Эти данные ложатся в таблицу. Параллельно с этим работает поток, который выбирает из этой таблицы данные по некоторым критериям посредством SQL-запроса, который выполняется например 1 минуту с индексами и 50 минут без индексов. Плюс есть локальный пользователь, который хочет просмотреть часть (отфильтрованную с помощью SQL-запроса) таблицы и возможно что-то в ней изменить, если захочет. Плюс есть точно такой же удаленный (пусть по локалке для простоты) юзер. Плюс есть поток, который просматривает таблицу, находит в ней по каким-то критериям записи и модифицирует их.
Наконец-то хоть намек на что-то конкретное !
Так вся эта по@#$нь спокойно реализуется в контексте ЕДИНСТВЕННОЙ Default-сессии (надо рассказывать, что ее не надо ни криэйтить, ни убивать или ты это все-таки прочитал ?)
Для ее реализации надо 3 DataSeta (каких, в принципе роли для парадокса не играет):
>Пусть есть некоторая железяка, с которой поступают асинхронно некоторые данные. Пусть частота поступления данных колеблется в пределах 20-80 секунд. Эти данные ложатся в таблицу
Датасет (допустим, TQuery), который откуда-то "берет" раскодированные аналоговые данные и добавляет их ПО ОДНОЙ в таблицу БД TABLE
>Параллельно с этим работает поток, который выбирает из этой таблицы данные по некоторым критериям посредством SQL-запроса, который выполняется например 1 минуту с индексами и 50 минут без индексов.
Датасет (допустим, TQuery), который попеременно, в зависимости от каких-то внешних факторов (например, таймера), выполняет выборку по каким-то условиям (нужны или нет при этом индексы для ускорения - второй вопрос) и куда-то эти результаты отправляет.
>Плюс есть локальный пользователь, который хочет просмотреть часть (отфильтрованную с помощью SQL-запроса) таблицы и возможно что-то в ней изменить, если захочет.
3.Датасет (допустим, TTable), который отображается в гриде и который может просматривать или править один или несколько узеров.
PS
>Плюс есть точно такой же удаленный (пусть по локалке для простоты) юзер
Да хоть 20 юзеров - на разных машинах НЕ МОЖЕТ БЫТЬ ОДНОГО ПОТОКА ФИЗИЧЕСКИ !!! А БД все равно будет обрабатывать запросы ПОСЛЕДОВАТЕЛЬНО !!!!!!!!!!!!
Для сложности интересно посмотреть как ты собираешься юзать Парадокс не по локалке. Через сокеты ?
>Плюс есть поток, который просматривает таблицу, находит в ней по каким-то критериям записи и модифицирует их.
Ничего не надо, т.к. в природе не существует задач, которые "что-то делают для чего-то"
Для 3-го запроса (и только для него !) надо периодически рефрешить НД, чтобы узер видел все изменения. Если надо "мгновенное" отражение внесенных им изменений, то либо отключать буферирование, либо "сбрасывать" изменения в каждом AfterDelete/Post/Insert (FlushBuffers).
Поверь, для решения этой траблы потоки и на фиг не нужны !
И еще раз повторюсь: для НАДЕЖНОЙ и БЫСТРОЙ работы подобного приложения при достаточно большом объеме данных, да еще при нескольких одновременно работающих узерах ПАРАДОКС НЕ ГОДИТСЯ по-любому.
Уважаемый киллер ! Кто-то, возможно книги и хэлпы, набили тебе голову этими потоками. Забудь о них на время ! Будет сразу проще жить ! И запомни простой постулат ЧЕМ ПРОЩЕ, ТЕМ ЛУЧШЕ !
← →
BlackTiger (2003-03-06 01:07) [40]2MsGuns
:))) Вот и я о том же! Начитаются всякой ерунды - многопоточность-многозадачность, мутексы-шмутексы, комы-дкомы и другой хр... фигни, потом делают все через... пути неисповедимые. И удивляются - почему это у них все работает "не так"? Эти мне "продвинутые"...
Гвозди электронным микроскопом тоже можно забивать, но молотком - оно по-проще...
Многопоточность (как мультизадачность) в системах "нереального" времени - хохма, придуманная хохмачами. Правда сейчас это модно, статеек в нете лежит много. Вот народ и думает, что "это хорошо".
← →
ki11er (2003-03-06 13:01) [41]2 MsGuns:
> В сабже указано четко - формат Парадокс. Локалка в натуральном
> виде ! Это априори чисто КЛИЕНТСКИЙ ПОДХОД.
> Объяснять разницу между локальной и клиент-серверной БД
> и, соответственно, ОГРОМЕННУЮ разницу в реализации доступа
> к данным ?
Я Вы не путаете понятия "клиент", "сервер", "технология клиент-сервер" ?
> Так вся эта по@#$нь спокойно реализуется в контексте ЕДИНСТВЕННОЙ
> Default-сессии (надо рассказывать, что ее не надо ни криэйтить,
> ни убивать или ты это все-таки прочитал ?)
> Для ее реализации надо 3 DataSeta (каких, в принципе роли
> для парадокса не играет):
Т.е. на то, что написано в хэлпе наплевать? Я правильно понял?
> Да хоть 20 юзеров - на разных машинах НЕ МОЖЕТ БЫТЬ ОДНОГО
> ПОТОКА ФИЗИЧЕСКИ !!! А БД все равно будет обрабатывать запросы
> ПОСЛЕДОВАТЕЛЬНО !!!!!!!!!!!!
;-O Серьезно? А как тогда Вы мне обясните, что одновременно с выполнением нескольких (или пусть одного) запросов через TQuery идет и запись в таблицу. Если бы все так просто было, я бы поставил крит секцию и спал бы спокойно ;-)))
> Поверь, для решения этой траблы потоки и на фиг не нужны
> !
Я все-таки не догнал. Это извиняюсь как? Работает допустим, какой-то станок, поддходик к компу юзер, тыкает кнопку "Сформировать мне отчет за прошлый год с раскладкой по месяцам 20 параметров и т.д. и т.п.". При этом в соответствии с вашими мыслями приостанавливается точение болванки (это в лучшем случае) и начинает формироваться отчет. Я все правильно понимаю?
> Уважаемый киллер ! Кто-то, возможно книги и хэлпы, набили
> тебе голову этими потоками. Забудь о них на время ! Будет
> сразу проще жить ! И запомни простой постулат ЧЕМ ПРОЩЕ,
> ТЕМ ЛУЧШЕ !
Ну что тут можно сказать?! Не могли бы Вы привести примеры проектов, которые Вам приходилось разрабатывать? Для BlackTiger тот же вопрос.
Похоже, ребята, я с вами просто теряю время :-( Да в базах я не силен, но не надо мне рассказывать про процессы, потоки и тому подобные вещи. А тем более говорить такие глупости (думаю, в данном случае это уже не является невежливостью).
PS. Просьба, если нечего сказать по существу, не захломляйте тред, он уже и так длинный ;-)))
← →
BlackTiger (2003-03-06 13:11) [42]ki11er! Щас ты меня выведешь! Такого хамства давно тут не было, да и не приветствуется оно. Можешь больше сюда не ходить, особенно с таким CounterStrik-омским ником.
То, что ты описываешь - реализуется ДВУМЯ, функционально разделенными приложениями. Одно отвечает за сбор и сохранение данных в БД, а другое - выборка и анализ. Два-в-одном хорошо только в шампуне, и иногда лучше жевать, а не говорить.
Если ты такой умный, то реализуй сам как знаешь, пи-ле-вать на тебя все хотели за такие наезды и хамство.
Хелпы - СПРАВОЧНАЯ информация, а не руководство к действию. В хелпах много всякой фигни понаписано - дальше своей головой думать нужно.
← →
Дмитрий К.К. (2003-03-06 13:15) [43]"Опасен не тот чел, шо не читал книжек, а тот, шо прочел ОДНУ книжку", ибо он будет думать, шо умнее его нетуть.
← →
MsGuns (2003-03-06 13:26) [44]>BlackTiger (06.03.03 13:11)
ИМХО, он просто не представляет себе КАК работает процессор, память, I/O и т.д. Его пример со станком и болванкой говорит сам за себя. Он думает, что если для него играется музыка, печатается отчет и играется гама, то все это происходит ОДНОВРЕМЕННО ! Блажен верующий ! Вдвойне блажен верующий невежда.
Потенциальный клиент для школы Ю.Зотова, хотя сомневаюсь, что с таким гонором он будет туда "ходить" ;)))
← →
Соловьев (2003-03-06 13:28) [45]А может у него многопроцессорная ситема с соответсвующей ОС?
← →
ki11er (2003-03-06 13:33) [46]
> Можешь больше сюда не ходить, особенно с таким CounterStrik-омским
> ником.
Это ты за всю конфу отвечаешь, или только за себя? Пока что ты не особо помог, так что нечего пугать. Насчет ника - к игрушкам он не имеет никакого отношения, я не особо их люблю, да и времени на это нет.
> То, что ты описываешь - реализуется ДВУМЯ, функционально
> разделенными приложениями. Одно отвечает за сбор и сохранение
> данных в БД, а другое - выборка и анализ. Два-в-одном хорошо
> только в шампуне, и иногда лучше жевать, а не говорить.
;-)))))))))))))))))))))))))))))))))))))))))))))))
Если продолжить мысль дальше N функций - N приложений. Давайте тогда каждую процедуру в свое отдельное приложение заталкивать!
;-)))))))))))))))))))))))))))))))))))))))))))))))
Нет, я определенно хочу взлянуть на примеры Ваших работ. Без обид.
> В хелпах много всякой фигни понаписано - дальше своей головой
> думать нужно.
Слов нет. Интересно, чтобы ответили на это в Inprise или Microsoft или в какой другой серьезной фирме... То, что на работу не взяли бы после этого, так сто процентов.
← →
MsGuns (2003-03-06 13:33) [47]>Соловьев © (06.03.03 13:28)
>А может у него многопроцессорная ситема с соответсвующей ОС?
Применительно к Парадоксовской базе (и не только) не избавит от последовательной обработки даже 8-ми процессорная система с рейдом. ПОКА НЕ БУДЕТ ВЫПОЛНЕН (ИЛИ НЕВЫПОЛНЕН ИЗ-ЗА ОШИБОК) ЗАПРОС "А", ЗАПРОС "Б" БУДЕТ ЖДАТЬ.
← →
BlackTiger (2003-03-06 13:35) [48]>А может у него многопроцессорная ситема с соответсвующей ОС?
:))) Ага! Многопроцессорный (штук так 20) токарный станок c ЧПУ и QNX на борту!
И пишет он для на Делфях :)))
← →
ki11er (2003-03-06 13:35) [49]
> ИМХО, он просто не представляет себе КАК работает процессор,
> память, I/O и т.д.
:-DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
← →
MsGuns (2003-03-06 13:37) [50]>MsGuns © (06.03.03 13:33)
.. И СОВЕРШЕННО ФИОЛЕТОВО (ПАРАДОКС ОБ ЭТОМ НЕ ЗНАЕТ) ИЗ РАЗНЫХ ПОТОКОВ (МАШИН) ОНИ ЗАПУЩЕНЫ ИЛИ ИЗ ОДНОГО !!!!!!!!!
← →
BlackTiger (2003-03-06 13:39) [51]Всё! Он меня достал! Живи своим умом, если такой умный.
Насчет Borland (а не Inprise) и Microsoft - они тебе скажут то же самое, поверь мне.
← →
ki11er (2003-03-06 13:45) [52]
> Насчет Borland (а не Inprise) и Microsoft - они тебе скажут
> то же самое, поверь мне.
:-DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
← →
sniknik (2003-03-06 13:51) [53]Вижу спор продолжается. Скажи сколько копий запустил?
ki11er (05.03.03 18:57)
...
> Думаю, что удастся, но ради очистки совести сейчас попробую...
+
доп. задание
в ADO движок Jet есть такой параметр
Threads - Число внутренних адресов подпрограмм, доступных для ядра Microsoft Jet. По умолчанию задается значение 3. Значения имеют тип DWORD в Windows 95 и Windows NT 4.0 или тип REG_DWORD в Windows NT 3.51.
я в BDE не силен, поэтому прошу тебя, найди мне аналог БДЕшный.
← →
BlackTiger (2003-03-06 13:53) [54]ki11er! А чёй-то не понимаю, чего ты ждешь? Что тебе скажут "ты прав, но у тебя тут маааленькая ошибочка"? Фигу! Весь твой вопрос - одна бооооооольшая ошибка. Начиная с подхода к решению.
Тебя люди пытаются от граблей предостеречь, а ты только ржешь как дурак в ответ.
Повторюсь - живи своим умом.
← →
ki11er (2003-03-06 14:07) [55]2 BlackTiger:
:-X |-O 8-|
2 sniknik:
Да проверил, нормально работает. 5 штук. Если больше - выдает "Не хватает памяти". Это отдельный вопрос насчет "не хватает памяти". Не понятно от чего это зависит и какой памяти не хватает (оперативки вроде достаточно, места на винте - вагон и маленькая тележка). Возможно ты прав, и где-то внутрях BDE и есть какое-то ограничение (которое можно или нельзя изменить). Но это вопрос к хорошо знающим BDE людям, которых я надеялся встретить здесь...
> я в BDE не силен, поэтому прошу тебя, найди мне аналог БДЕшный.
Мысль понятная, перекопаю настройки еще раз... Спасибо.
← →
ki11er (2003-03-06 14:12) [56]Одна поправка насчет "Да проверил, нормально работает." Нормально проверить конечно же не было времени ;-) Имеется в виду проработало полдня без сбоев.
← →
sniknik (2003-03-06 14:28) [57]> Но это вопрос к хорошо знающим BDE людям, которых я надеялся встретить здесь...
радуйся ты их встретил. :-)) и уже восстановил их против себя. (почти все с кем ты спорил и обсмеивал знают о BDE гораздо больше меня к примеру, в силу специфики я начал с ADO, BDE только коственно)
> где-то внутрях BDE и есть какое-то ограничение
точно есть, и можно поменять, но не советуют (доводы уже не раз здесь прозвучали).
p.s. пока. удачи в поисках.
← →
ki11er (2003-03-06 14:46) [58]
> > Но это вопрос к хорошо знающим BDE людям, которых я надеялся
> встретить здесь...
> радуйся ты их встретил. :-)) и уже восстановил их против
> себя.
;-))) Они вроде про BDE ничего (или почти ничего) не говорили
;-))) В основном обсуждали мой "моральный облик" ;-)))
← →
ki11er (2003-03-06 16:44) [59]
> MsGuns © (06.03.03 13:33)
> Применительно к Парадоксовской базе (и не только) не избавит
> от последовательной обработки даже 8-ми процессорная система
> с рейдом. ПОКА НЕ БУДЕТ ВЫПОЛНЕН (ИЛИ НЕВЫПОЛНЕН ИЗ-ЗА ОШИБОК)
> ЗАПРОС "А", ЗАПРОС "Б" БУДЕТ ЖДАТЬ.
;-)))
http://www.elance.ru/ki11er/Paradox.jpg
И что мы, дети, видим на этой картинке (Время старта запроса / время завершения запроса)?
Не вводите народ в заблуждение :(
← →
Smashich (2003-03-06 17:46) [60]2 ki11er (06.03.03 16:44)
не приходило в голову что на картинке время выполнения потока а не запроса? а как насчет кода который показал тебе эти результаты?
← →
ki11er (2003-03-06 17:57) [61]
> не приходило в голову что на картинке время выполнения потока
> а не запроса?
Не понял... Код писал я сам и в точности знаю, что он делает. На картинке время выполнения запроса, хотя оно не очень отличается от времени работы потока, т.к. поток кроме этого (выполнения запроса) больше ничего не делает (за исключением создания объектов вначале и разрушиния в конце).
> а как насчет кода который показал тебе эти результаты?
Никак. Здесь же есть более умные, пусть они код и выложат... Я ж все "неправильно" пишу... ;-)))
← →
Anatoly Podgoretsky (2003-03-06 17:59) [62]На тарелочке, с известной каемочкой.
← →
MsGuns (2003-03-06 18:07) [63]>ki11er (06.03.03 17:57)
>Здесь же есть более умные, пусть они код и выложат
У меня сложилось иное мнение об этой ветке.
Пришел один умный пацан и задал такой же умный вопрос, а несколько дураков, прикинувшись типа мастерами, стали донимать его тупыми, не оносящимися к теме вопросами и еще более тупыми ответами. При этом сами-то они ни фига, ессно, не могут и никогда не могли, а умному пацану просто пАрят мОзги. Наверное, для поднятия авторитета в собственных дурацких глазах
;)))
← →
Anatoly Podgoretsky (2003-03-06 18:09) [64]Но ключи от кваритры не дают :-)
← →
ki11er (2003-03-06 18:13) [65]
> У меня сложилось иное мнение об этой ветке.
> ...
Не знаю, какое у Вас сложилось мнение, это Ваши личные проблемы. Я пришел сюда за квалифицированной помощью, т.к. сам не очень силен в данном вопросе. Задал максимально _конкретный_ вопрос. В ответ получил многостраничную беседу о смысле жизни, порядке вещей, моей компетентности, и т.д. и т.п. Короче, много чего, но только не то, за чем пришел :(
← →
Smashich (2003-03-06 18:16) [66]2 ki11er (06.03.03 17:57)
ндя....
← →
BlackTiger (2003-03-06 18:23) [67]Дебилы мы тут все убогие, в общем.
Ламеры полные, нифига не понимающие в программировании. Да и вообще сайт этот надо закрывать, потому как тут только идиоты собрались.
:))))
ki11er! А ведь это вроде твой далеко не первый такой "странный" вопрос? Лениво рыться в архивах. И на прошлые твои вопросы вроде тоже были такие же "идиотские" ответы. Ни о чем не говорит?
← →
Smashich (2003-03-06 18:25) [68]Удалено модератором
Примечание: Давай без личных оскорблений
← →
ki11er (2003-03-06 18:34) [69]
> ki11er! А ведь это вроде твой далеко не первый такой "странный"
> вопрос? Лениво рыться в архивах. И на прошлые твои вопросы
> вроде тоже были такие же "идиотские" ответы. Ни о чем не
> говорит?
Какие проблемы? Вот они все:
1. вопрос про TSession http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1046715844&n=1
Напрямую связан с обсуждаемым здесь вопросом, естесственно ответа нет...
2. dBASE или Paradox http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1046771586&n=1
Ответа нет. Если конечно не считать ответом утверждения, что я, типа, ничего не понимаю...
3. Как нужно создавать таблицу, чтобы ее макс. размер был 2Gb?
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1046768740&n=1
Получен более-менее нормальный ответ на вопрос как. Но никак не объясняется, к каким коссвенным результатам это приведет, и почему это Borland по умолчанию так не сделал?
4. Одновременные запросы (BDE)... http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1046699069&n=1
Примерно то же, что и эта ветка.
5. TTable vs TQuery http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1046688075&n=1
Тоже нет конкретного ответа.
-------------------------------------------------------------
Итого: на 5 вопросов получен 1 более-менее приемлимый ответ.
Может в консерватории что-то нужно подправить? (c) М. Жванецкий.
← →
ki11er (2003-03-06 18:38) [70]Удалено модератором
← →
Anatoly Podgoretsky (2003-03-06 18:52) [71]Ответы тебе были даны и уж это твоя проблема, что ты их не понимаешь, но не как не тех людей. Методика ведения дисскусси во всех этих ветках, а также в не указанных не отличается.
При такой методике тебе скоро совсем прекратят отвечать, кому охота оказаться облитыми грязью.
← →
MsGuns (2003-03-06 18:58) [72]Побуду-ка еще раз идиотом (достал пацан вконец !)
Не, ну в самом деле, нормальный пачан пришел в форум за квалифицированным советом. В надежде, что в в его конкретном коде
(который не работает) конкретные спецы конкретно разберутся и конкретно дадут ответ, в какой конкретной строке кода содержится конкретная ошибка и как эту ошибку конкретно исправить.
При этом вубаться в смысл того, что там написано, конкретно не будут (типа, а что это вообще за прога, что она должна делать и т.д.)
Просто раберутся и ответят. Желательно с выложением собственных фрагментов, где что-то реализуется именно так, как в его собственном коде. При этом спецы должны все это разжевать, прокомментировать, объяснить суть и вывести мораль. В этом случае у нормального пачана будет нормальное мнение о нормальных посетителях нормального форума.
И за эту-то пустяковину (по мнению пачана) он (пачан) скажет спецам (не всем, а только тем, кто особо достоин) свое пачанское спасибо.
Не вышло... Не оправдали... Осрамились...
Выводы:
- Нормальным пачанам не фиг лазать по отстойным форумам
- Если уж вошли, то сразу предупреждать, чтоб фуфлы в ЕГО ветки не залазили. Так сказать, не посягали.
- Если посягнут, то они суть идиоты и дураки, потому как пачан так для себя решил сразу и бесповоротно.
Ты, "убийца здравого смысла", написал, что это "мои проблемы".
Так вот я их сейчас и решу.
Просто пошлю тебя и твою ветку туда, где обоим самое место.
← →
ki11er (2003-03-06 18:59) [73]
> При такой методике тебе скоро совсем прекратят отвечать,
> кому охота оказаться облитыми грязью.
Это уже флейм, но кого я "облил" грязью? У меня и в мыслях этого не было. Я просто предложил совместными усилиями решить проблему и все 8-O
← →
ki11er (2003-03-06 19:08) [74]2 MsGuns:
Распальцовки-распальцовками... Но... Вопрос, который я задал, довольно принципиальный для тех, кто серьезно работает через BDE с Paradox"ом (насколько это вообще возможно...). Это не просто тупая программулина новичка, а тест, который должен ответить на вполне конкретные вопросы. Что это за программа и для чего я пояснил несколько раз. Хотя, не знаю, может у меня и с русским языкам проблемы, а не только с языками программирования ;-)
← →
ki11er (2003-03-06 19:11) [75]Удалено модератором
Примечание: Модератор сам решит, удалять или нет или оставить в назидание потомкам
← →
Serginio (2003-03-06 19:20) [76]Попробуй FTable.SessionName:=FSession.Name или используй для каждого потока свой TDataModule c TSessinon.AutoSessionName:=True. Ограничение БДЕ на одновременно открытых сессиях помоему 48. Кстати при использовании СОМ объектов как раз применяется такая схема
← →
ki11er (2003-03-06 21:02) [77]
> Попробуй FTable.SessionName:=FSession.Name
Так а я как делаю?
if bWithSession then begin
_FSession := Sessions.OpenSession("Session" +
IntToStr(integer(@_FSession)) +
IntToStr(GetTickCount));
str_dir := StartDir + "Private" + "\" + _FSession.SessionName;
CreateDir(str_dir);
_FSession.PrivateDir := str_dir;
_FSession.NetFileDir := StartDir + "net";
FTable.SessionName := _FSession.SessionName;
end else begin
_FSession := nil;
end;
2 Модератор:
Понятно. Типа, "особы, приближенные к императору". Ок, больше не повторится.
← →
MsGuns (2003-03-06 21:50) [78]Отброшу обиды, - в чем-то мне очень симпатичны такие дотошные парни, пусть даже и нагловатые (с опытом пройдет)
Кажется, я начинаю понимать смысл твоего эксперимента.
Похоже, ты собираешься проэмулировать движок (в данном случае БДЕ) на предмет многочисленных асинхронных обращений к одним и тем же объектам БД и в виду отсутствия "живых" 11 ПК с сидящими за ними в "полной боевой готовности" узерами ты задумал написать тестовое приложение, которое якобы будет работать за этих самых узеров. Эмуляцию каждого узера ты и пытаешься организовать в одной - разъединственной проге с помощью потоков каждый со своей "автономной" сессией. Угадал ?
Если да, то:
Во-первых:
1. Достаточно было написать прогу, работающую с таблицей стандартно.Через стандартные компоненты и безо всякого распараллирования.
Ввести в прогу некий "флаг готовности", проверяя который она решает, начать ли ей свои вставки/удаления/изменения
Т.е. пока "флаг" не горит, он просто ждет, ничего не делая
2. Запустить эту прогу 11 раз.
3. Зажечь флаг и смотреть. (Можно с секундомером или до первого эксепшена.
В качестве флага можно использовать, например, простецкий текстовый файл с одной строкой типа "Поехали !". Как только ты создашь такой файл, твои все 11 прог запустят свои "машинки".
Для варьирования циклов и типов модификаций (вставка/удаление/изменение) каждой прогой можно придумать мульон разных алгоритмов,- я думаю что для тебя это не проблема
Во-вторых:
Даже если у тебя все нормально отработает и ты получишь какие-то результаты, то они (результаты) не будут отражать ровным счетом НИЧЕГО. Просто потому, что сэмулировать РЕАЛЬНУЮ ситуацию на РЕАЛЬНОЙ БД с РЕАЛЬНЫМИ клиентами с их прибамбасами чрезвычайно сложно. И уж совершенно невозможно без привязки к КОНКРЕТНОЙ БИЗНЕС-ЛИГИКЕ БД, т.е. к составу и структурам таблиц БД, их связей, ограничений и так далее и так потом.
Именно поэтому вся эта ветка изначально была начата тобою зря. Даже если ты запустишь и отладишь свой код, твоя прога и, ГЛАВНОЕ, цель, которую ты ею преследуешь, окажется АБСОЛЮТНО БЕСПОЛЕЗНОЙ.
Это как попытаться создать панацею от всех болезней.
← →
ki11er (2003-03-06 22:36) [79]2 MsGuns:
это уже больше похоже на конструктивную беседу...
> Похоже, ты собираешься проэмулировать движок (в данном случае
> БДЕ) на предмет многочисленных асинхронных обращений к одним
> и тем же объектам БД и в виду отсутствия "живых" 11 ПК с
> сидящими за ними в "полной боевой готовности" узерами ты
> задумал написать тестовое приложение, которое якобы будет
> работать за этих самых узеров. Эмуляцию каждого узера ты
> и пытаешься организовать в одной - разъединственной проге
> с помощью потоков каждый со своей "автономной" сессией.
> Угадал ?
Это не совсем так, основная причина все же - желание узнать как правильно нужно делать подобные вещи. А если уж так важна конкретика (хотя я честное слово этого не понимаю), то есть приложение (достаточно солидное), написанное на Delphi. В нем как раз идет работа с одной таблицей из нескольких потоков (кое-где через TTable, кое-где через TQuery). Написать по-другому (типа разнести в несколько приложений или свести всю работу в один поток) это нельзя, поверьте уж на слово. Написано все так, как Вы советуете, т.е. особо не задумываясь без доп. сессий. Периодически возникают проблемы с таблицей, а их быть не должно (по крайней мере не чаще, чем раз в пару месяцев). Я начал исследовать этот вопрос и нарыл некоторое количество информации, написанной не самыми глупыми людьми (в том числе и из Borland/Inprise). Исходя из этих рекомендаций и появился этот код.
Хочу, чтобы Вы все-таки поняли, что для меня не составляет никакого труда перевести все на MS Jet, MS SQL, MySQL, InterBase или что-то подобное. Но, мне интересно, почему именно этот код не работает и как заставить его работать (или доказать, что это невозможно).
Насчет нескольких копий программы - это еще сложнее, чем с потоками (Вам никогда не встречалось сообщение "Table is busy"?).
Резюме. Пусть целью будет просто протестировать BDE в указанных условиях (желательно на разных машинах и разных ОС). Если тестовая программа проработает в течение, например, месяца с двойной-тройной загрузкой от номинальной, значит этот код можно будет использовать в той программе, о которой я говорил. Вот и все в общем-то.
← →
altarasjuk (2003-03-06 23:21) [80]У меня была подобная проблема правда с Accessom и через ADO, но в потоках суть может сводиться к следующему:
попробуй mutex мне помогло (API CreateMutext,WaiteForSingleObject) глянешь в хелп по ним, они довольно простые. может поможет. Тока mutex нужно создавать один раз для всей проги и ОБЯЗАТЕЛЬНО его удалять.
← →
zacho (2003-03-06 23:26) [81]> Хочу, чтобы Вы все-таки поняли, что для меня не составляет
> никакого труда перевести все на MS Jet, MS SQL, MySQL, InterBase
> или что-то подобное
Без обид :-), я не знаю, есть ли у тебя опыт такого рода "перевода".
У меня - есть. Поэтому хочу предостеречь: перевести систему с одной СУБД на другую (а тем более с файл-серверной БД на полноценную РСУБД) не намного проще, чем разработать ее с нуля. Конечно, если не ставить целью получить тормозное глюкало :) Или если система (по крайней мере сама БД) весьма простая.
← →
MsGuns (2003-03-06 23:37) [82]>ki11er
Было бы, ИМХО, целесообразным хорошенько тебе подумать и как можно конкретнее и внятно сформулировать суть проблемы, не поленившись описать текущую ситуацию и то, что в конце-концов надо получить. Не вдаваясь ни в какие сессии, потоки и прочие детали реализации.
Все это написать в сабже к новой ветке. А эту пора положить в архив. Больно здоровая, а толку - чуть.
С уважением.
← →
ki11er (2003-03-07 12:20) [83]2 altarasjuk:
не, так не пойдет, я уже писал выше...
2 zacho:
"БД" очень простая - одна таблица ;-))) Опять же об этом писалось выше не один раз. На SQL пробовал - за исключением пары мелких проблем все нормально. Но не хотелось бы из пушки стрелять по комарам ;-)))
2 MsGuns:
Ok. Открою новую и еще раз напишу ;-)))
← →
Anatoly Podgoretsky (2003-03-07 14:47) [84]Незачем спам разводить, хватит и одной ветки
← →
ki11er (2003-03-07 16:39) [85]Новую ветку запретил модератор. Будем мучаться здесь :(
Итак, раз здесь не нашлось любителей решать задачу просто потому, что она не решена без привязки к объектам окружающей действительности, попробую еще раз описать реальную задачу.
1. Есть написанное на Delphi многофункциональное приложение.
2. При работе в одном из режимов возникают проблемы с таблицей (чаще всего с индексами).
3. Работа с таблицей построена через BDE, сама таблица - Paradox.
4. Таблица имеет порядка 20 полей (типы - лонг, стамп, строка, логический). Автоинкремента нет. Один первичный индекс (лонг), 2 вторичных - 1. лонг+лонг; 2. лонг.
5. "Глобально" переделывать приложение (менять БД, менять структуру самого приложения, ...) у меня пока нет никакого желания, а точнее говоря, я не вижу предпосылок для этого, так как согласно документации, все должно работать в существующем варианте с минимальными переделками.
6. Для того, чтобы с горяча не править само приложение было принято решение написать тест, на нем все отработать и потом перенести в целевую программу.
7. Теперь о том, что должна программа в этом режиме делать. С многоканального оборудования асинхронно поступают данные, которые должны заноситься в таблицу достаточно быстро, иначе могут потеряться (при выполнении только этой задачи - запас по времени достаточно большой). Одновременно с этим должна производиться обработка полученной информации. Эта обработка включает в себя относительно длинный SQL-запрос и некоторую модификацию таблицы. Одновременно с этим пользователь может захотеть просмотреть данные, причем имеет возможность настроить достаточно "извращенную" фильтрацию, чтобы соответствующий SQL-запрос тоже выполнялся достаточно долго. При желании, пользователь может модифицировать некоторые поля таблицы (правда это делается достаточно редко). На самом деле все несколько сложнее, но пусть задача будет сформулирована так.
8. Надеюсь, понятно, что основная задача - записать данные, а остальная обработка может идти относительно медленно.
Способы решения:
1. Заставить работать многопоточный вариант.
2. Разграничить доступ потокам через синхронизацию, но появляется риск потерять данные, что не есть хорошо, а очень даже плохо.
3. Буферизовать обращения к таблице с риском войти в "клинч", когда система по каким-то причинам не станет справляться с нагрузкой. А это есть уже совсем нехорошо.
...
← →
Mike Kouzmine (2003-03-07 16:47) [86]Сколько раз инициализируется БДЕ в твоей программе?
Один раз или несколько?
Если один раз, то сколько бы потоков не выполнялось, БДЕ будет писать данные последовательно, то есть сначала обрабаотает один запрос, затем другой... Исходя из этого, что многопоточный доступ, что однопоточный, по барабану. И нет смысла все это городить.
Если бы я писал эту программу, то сделал бы объект, который бы собирал асинхронно данные, а затем в какой-то момент писал бы это все в базу.
← →
sniknik (2003-03-07 17:00) [87](писал уже в грохнутой ветке)
можно организовать очередь из сообщений, в принципе ничего терятся не должно.
многопоточный вариант записи в базу, только затормозит процесс, что скорее приведет к потере данных. (оптимум 2 потока 1 на запись и 1 на чтение, было бы ADO то 2 асинхронно работающих компонента)
время выполнения 2х потоков = время одного + время другого + время на переключение, вообще потоки имеют смысл если система простаивает (в режиме ожидания) а несколько со стопроцентной загрузкой не будут быстрее одного.
(надеюсь понятно изложил, its мое мнение, переубеждению не подлежит :-)))
Mike Kouzmine (07.03.03 16:47)
> что многопоточный доступ, что однопоточный, по барабану
я бы даже сказал больше (и сказал :)), что наоборот тормознее будет, с такими потоками.
← →
Mike Kouzmine (2003-03-07 17:16) [88]sniknik © > Я читал и полностью согласен, просто хотелось с новыми силами еще раз про это...
← →
ki11er (2003-03-07 17:41) [89]2 Mike Kouzmine & sniknik:
Еще раз смотрим вот сюда:
http://www.elance.ru/ki11er/Paradox.jpg
про стопроцентную нагрузку никто не говорит, это вообще не реализуемо...
← →
Mike Kouzmine (2003-03-07 17:51) [90]Разговор идет о том, что многопоточный доступ к файл-серверным базам в том виде в котором ты хочешь работать нелогичен по своей сути, и по ограничения движка. И дело не в том, что есть у тебя ошибка в коде или нет ее, сам вопрос, скажем так, не имеет ответа за отсутствием оного.
← →
ki11er (2003-03-07 17:58) [91]
> Сколько раз инициализируется БДЕ в твоей программе?
> Один раз или несколько?
Что имеется в виду?
← →
Mike Kouzmine (2003-03-07 18:07) [92]То что спрашивается, то и имеется. Сколько раз происходит инициализация BDE?
← →
ki11er (2003-03-07 18:12) [93]
> Разговор идет о том, что многопоточный доступ к файл-серверным
> базам в том виде в котором ты хочешь работать нелогичен
> по своей сути, и по ограничения движка. И дело не в том,
> что есть у тебя ошибка в коде или нет ее, сам вопрос, скажем
> так, не имеет ответа за отсутствием оного.
И еще раз смотрим :-(
http://www.elance.ru/ki11er/Paradox.jpg
← →
ki11er (2003-03-07 18:24) [94]
> То что спрашивается, то и имеется. Сколько раз происходит
> инициализация BDE?
Я не знаю, что это такое, соответственно ни разу.
← →
Mike Kouzmine (2003-03-07 18:24) [95]Я не только посмотрел, но и рапечатал и повесил на стенку.
Но суть-то от этого не меняется. Вот если бы ты создал новый процесс и для него инициировал бы бде, то, теоретически, можно было бы производить однотипную операцию "одновременно", заметь ковычки.
← →
ki11er (2003-03-07 18:30) [96]
> То что спрашивается, то и имеется. Сколько раз происходит
> инициализация BDE?
Я не знаю, что это такое, соответственно ни разу.
← →
Mike Kouzmine (2003-03-07 18:41) [97]Сделай программу, которая будет читать или писать из базы, и запусти ее н раз. Вылетит та же ошибка. Ни на какие мысли не наводит это?
← →
ki11er (2003-03-07 18:48) [98]
> Я не только посмотрел, но и рапечатал и повесил на стенку.
> Но суть-то от этого не меняется.
Т.е. "не верь глазам своим"?
> "одновременно", заметь ковычки
Заметил, это не обсуждается...
В чем разница с точки зрения работы с базой (через BDE) между 2мя процессами и 2мя потоками (за исключением, конечно того, что доп. процесс добавит доп. проблем)?
← →
Mike Kouzmine (2003-03-07 18:54) [99]Ты знаешь, надо почитать, в принципе код должен работать, ну кроме
procedure CTestThread.AfterPost(DataSet: TDataSet);
begin
FTable.FlushBuffers;
end;
По идее он должен выкинуть эксепшен что датасет не в Insert or Edit mode
← →
Mike Kouzmine (2003-03-07 18:55) [100]Но это на первый взгляд.
← →
Mike Kouzmine (2003-03-07 19:00) [101]Попробуй, как тебе советовали, создавать и TDatabase для каждой таблицы, на нее сессию, а на таблицу этот TDatabase
← →
Mike Kouzmine (2003-03-07 19:03) [102]Потом actcount - это глобальная переменная? В нее пишут все потоки?
Как происходит взаимодействие с визуальными компанентами твоих потоков?
← →
ki11er (2003-03-07 19:51) [103]
> Сделай программу, которая будет читать или писать из базы,
> и запусти ее н раз. Вылетит та же ошибка. Ни на какие мысли
> не наводит это?
А на какие мысли это должно наводить? К тому же сделал уже давно - достаточно почитать то, что было написано выше...
> procedure CTestThread.AfterPost(DataSet: TDataSet);
> begin
> FTable.FlushBuffers;
> end;
> По идее он должен выкинуть эксепшен что датасет не в Insert
> or Edit mode
;-) Практически во всех мануалах советуют это делать (либо так, как написано, либо через DbiSaveChanges()). Тоже наплевать (так же, как и на help)?
← →
sniknik (2003-03-07 20:30) [104]ki11er (07.03.03 17:41)
> Еще раз смотрим вот сюда:
в свою очередь посмотри еще раз сюда -> sniknik © (07.03.03 17:00)
вижу остался не понятым. ладно попытаюсь еще раз (last time) другими словами. в общем так, делаеш 2 потока в каждом по запросу (ну чем ты уже хвастался), запускаеш одновременно и ждеш завершения последнего, засекаеш время и смотриш сколько прошло.
второй этап запускаеш эти же запросы последовательно без потоков (в основном) последовательно. Засеки прошедшее время и сравни с потоковым методом. Теоретически в потоке будет потрачено больше времени на выполнение (неуверен только будет это видно на 2х потоках) разница будет тем больше чм больше будет задействовано потоков, т.к. квантование и распределение "тиков" между потоками тоже требует ресурсов.
(надеюсь засекать будеш не по будильнику :-)))
> про стопроцентную нагрузку никто не говорит, это вообще не реализуемо...
тогда какая тебе разница?
судя по пункту
(> 7. Теперь о том, что должна программа в этом режиме делать. С многоканального оборудования асинхронно поступают данные, которые должны заноситься в таблицу достаточно быстро, иначе могут потеряться (при выполнении только этой задачи - запас по времени достаточно большой). .....)
интенсивность поступающих данных велика, и вся бодяга с потоками затеяна ради ускорения записи в базу. А тебе уже в который раз пытаются доказать что ускорения не будет.
и единственное что нужно это грамотно организовать очередь, буфер или чтото подобное.
← →
ki11er (2003-03-07 21:18) [105]
> Как происходит взаимодействие с визуальными компанентами
> твоих потоков?
Никак...
← →
Mike Kouzmine (2003-03-07 21:30) [106]Если сделать Post, а затем FlushBuffers, то выдается ошибка.
Надо или Flush или Post
← →
ki11er (2003-03-07 21:31) [107]2 sniknik:
Неа... Не надо меня путать ;-) Суммарное время выполнения конечно же будет больше (при параллельном, сорри, забыл - псевдо параллельном, а то опять начнется...). Но! Критический по времени поток запишет данные пусть за 3 секунды вместо 2 параллельно с выполнением некритического. А не будет ждать условно говоря полчаса пока некритический что-то сделает. Улавливаешь в чем разница? ;-)))
← →
Mike Kouzmine (2003-03-07 21:35) [108]Соврал
← →
ki11er (2003-03-07 21:35) [109]
> Если сделать Post, а затем FlushBuffers, то выдается ошибка.
Никаких ошибок быть не должно - у Вас что-то не так написано.
Post и Flush несколько разные вещи... Кстати, что за ошибка?
← →
sniknik (2003-03-07 21:51) [110]Критический это надо полагать запись от прибора, некритический это так сказать запрос от пользователя?
вот и делай 2 потока критический /запись и некритический /чтение юзером. Что уже не раз предлагалось. (и мной в том числе)
все на этом завязываю. т.к. полагаю что ты чтото вроде мазахиста, тебя вроде как уламывают а ты оказывается все с самого начала знал, но не соглашался вроде из принципа но прочтение ветки показывает что это не так, только пальцы гнеш.
(сказал бы это в начале, 2/3 флейма бы не было, но ты это отрицал)
пока.
p.s. нику ki11er больше не отвечаю, бессмысленно, знает больше всех на форуме вместе взятых, но почемуто вые%:&ся. (сарказм) если же это не так и чегото всетаки подчерпнул то тогда просто неблагодарная скотина.
← →
Serginio (2003-03-07 21:58) [111]Не согласен с (sniknik ©) и делая доступ (чтение) к FoxPro Filesan Файлоф 1С в разных сочетаниях как последовтельных так и паралельных. И время одновременных обращениях к БД на уровне курсоров одинаково. Скорей всего проблема заключается в том, что каждый поток забирает очень много ресурсов хотя у меня не встречалось. Есть опыт работы через DCOM и TSocketConnrctinon нужно проследить где слабое место.
А для записи (sniknik © прав однозначно) для локальных баз Используй MultiReadWriteIsclusive или его аналги(Это не SQL). Это правильно.
← →
ki11er (2003-03-07 22:01) [112]
> вот и делай 2 потока критический /запись и некритический
> /чтение юзером. Что уже не раз предлагалось. (и мной в том
> числе)
8-O Так так и сделано 8-O
А предлагалось мне (не тобой, - другими) "забыть про потоки" и т.п. - почитай выше?! Я уже перестаю вообще что-то понимать 8-O
> тебя вроде как уламывают а ты оказывается все с самого начала
> знал, но не соглашался вроде из принципа но прочтение ветки
> показывает что это не так, только пальцы гнеш.
> (сказал бы это в начале, 2/3 флейма бы не было, но ты это
> отрицал)
Не понимаю, о чем ты? Кто уламывает? С чем не соглашаюсь? Какие пальцы?
Мдааа...... 8-(
← →
ki11er (2003-03-07 22:06) [113]sniknik © (07.03.03 17:00):
(писал уже в грохнутой ветке)
можно организовать очередь из сообщений, в принципе ничего терятся не должно.
многопоточный вариант записи в базу, только затормозит процесс, что скорее приведет к потере данных. (оптимум 2 потока 1 на запись и 1 на чтение, было бы ADO то 2 асинхронно работающих компонента)
время выполнения 2х потоков
sniknik © (07.03.03 21:51):
вот и делай 2 потока критический /запись и некритический /чтение юзером. Что уже не раз предлагалось. (и мной в том числе)
Это я накануне праздника перепил или все-таки не я? ;-)))
← →
MsGuns (2003-03-07 22:10) [114]Есть мысли, но в эту ветку не буду отвечать из принципа.
Завели новую, там будет все как бы с нуля. Не смотри на модноратора :))) - это вполне нормальные челы ;)))
← →
sniknik (2003-03-08 00:02) [115]видиш только то что хочеш, не пытаясь понять, а без понимания нет разговора, есть бессмысленный спор.
ki11er (07.03.03 22:06)
sniknik © (07.03.03 17:00):
(писал уже в грохнутой ветке)
можно организовать очередь из сообщений, в принципе ничего терятся не должно.
многопоточный вариант записи в базу, только затормозит процесс, что скорее приведет к потере данных. ( оптимум 2 потока 1 на запись и 1 на чтение, было бы ADO то 2 асинхронно работающих компонента)
время выполнения 2х потоков
sniknik © (07.03.03 21:51):
вот и делай 2 потока критический /запись и некритический /чтение юзером. Что уже не раз предлагалось. (и мной в том числе)
Это я накануне праздника перепил или все-таки не я? ;-)))
по мне так это равнозначные утверждения, с попыткой сказать другими словами. (ну если недопираеш, (только в конце фраза типа давно все знал, а вы меня только путаете)) многопоточный, ну это уж извини после твоих 11-ти ассоциация.
← →
Serginio (2003-03-11 12:11) [116]Протрезвел.
1. Используй MultiReadExclusiveWriteSinchronize.
Или LockTable.
Дело в том, что при записи в локальную таблицу происходит как запись в таблицу, так и перестроение индекса. А когда несколько потоков начинают одновременно индексировать (Типичные Б Деревья) вот ты и получаешь все выше перечисленные проблемы.
← →
ki11er (2003-03-11 14:40) [117]2 MsGuns:
пиши сюда:
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1047032189&n=1
2 sniknik:
Ok. Давайте определимся с понятиями, чтобы в дальнейшем не путаться:
многопоточный - количество потоков > 1.
поток записи - поток, который пишет в таблицу новые записи или модифицирует старые.
поток чтения - поток, который только читает из таблицы.
2 Serginio:
Я уже склоняюсь, к тому, чт возможно так и придется сделать. Но почему это не сделано на уровне ядра BDE? Или все-таки сделано, но нужно знать как правильно с этим работать? У кого есть Аргументированный ответ?
← →
app (2003-03-11 14:42) [118]ki11er (11.03.03 14:40)
2 MsGuns:
И не пытайся
← →
Serginio (2003-03-11 14:57) [119]Однозначно BDE не следит за записями в файл т. к. у тебя реализован многопользовательский доступ (Может и возможно но скорее нет когда ты реализуешь Eксклюзивный доступ через клонирование курсоров). Для этого и существует LockTable.
Даже если ты MultiReadExclusiveWriteSinchronize ты должен быть уверен, что к таблице никто не подключен с другого компьютера или процесса.
← →
ki11er (2003-03-11 16:31) [120]2 Serginio:
> Однозначно BDE не следит за записями в файл
Где это написано?
← →
Serginio (2003-03-11 17:30) [121]BDE тебе дает доступ (запись,чтение) к файлам через драйверы Paradox и больше ничего. Все остальное делается на уровне файлов (Открытие Эксклюзивно (OpenFile с флагом OF_SHARE_EXCLUSIVE), LockFile). А вот если ты сам будешь следить ты можешь получить клиент-сервер на локальных БД.
← →
Dred2k (2003-03-11 18:03) [122]Для каждого TQuery/TTable, используемого в отдельном потоке - своя пара TDatabase/TSession. С уникальными именами (GetTickCount точно не катит - лучше уж IntToStr(Integer(созданный объект))).
FDB := TDatabase.Create(nil);
FSession := TSession.Create(nil);
FQuery := TRxQuery.Create(nil);
FSession.SessionName := "SESSION" + IntToStr(Integer(FSession));
FDB.AliasName := "NVTEST"; // К примеру
// ... или настраивайешь ручками через DriverName := и все такое ...
FDB.DatabaseName := "DB" + IntToStr(Integer(FDB));
FDB.SessionName := FSession.SessionName;
with FQuery do begin
SessionName := FDB.SessionName;
DatabaseName := FDB.DatabaseName;
SQL.Clear;
SQL.Add("");
end;
Дальше в нити делай с FQuery что душе угодно. И будет тебе счастье ...
Только учти - у БиДЕ есть ограничения на всякие ресурсы, типа баз, сессий и курсоров -> http://www.delphikingdom.com/asp/answer.asp?IDAnswer=6280
← →
ki11er (2003-03-11 19:07) [123]2 Serginio:
Повторю вопрос: "Где это написано?" и могу добавить еще один:
"Зачем тогда сделаны все эти заморочки с файлами блокировки и т.п.? Не думаю, что это нужно для совместного чтения".
2 Dred2k:
у меня так:
_FSession := Sessions.OpenSession("Session" +
IntToStr(integer(@_FSession)) +
IntToStr(GetTickCount));
GetTickCount - для защиты от возможной ситуации, когда в двух запущенных копиях программы случайно совпадут (@_FSession).
> Только учти - у БиДЕ есть ограничения на всякие ресурсы,
> типа баз, сессий и курсоров ->
Это я уже понял. Ограничения есть, причем на первый взгляд ничем не оправданные :( Но с этим еще можно как-то смириться...
Вариант с DataBase я тоже пробовал. Результат аналогичный. Пока что работаю с TTable, вариант c TQuery ждет своей очереди (мне тут неоднократно говорили, что TTable и TQuery - один фиг, хотя я конечно не очень в это верю).
← →
ki11er (2003-03-11 20:06) [124]2 Dred2k:
Работает уже около полугода. Выявлены интересные особенности движка бде (но это - уже другая история ...). ;)
Можешь рассказать, что это за особенности? (можно на мыло)
← →
Serginio (2003-03-11 20:54) [125]1. "Однозначно BDE не следит за записями в файл" доказательство твоей ситуации.
2.Блокировки идут на уровне файлов. Читай посты.
3. Если ты попрбуешь использовать
MultiReadExclusiveWriteSinchronize то у тебя все должно прекрасно получиться. Если не влом проверь и сообщи о результатах.
← →
ki11er (2003-03-11 21:18) [126]2 Serginio:
> 1. "Однозначно BDE не следит за записями в файл" доказательство
> твоей ситуации
Делать какие-то выводы, imho, преждевременно.
> 2.Блокировки идут на уровне файлов. Читай посты.
Какие конкретно? В свою очередь могу посоветовать почитать что-нибудь про *.net и *.lck файлы.
> 3. Если ты попрбуешь использовать MultiReadExclusiveWriteSinchronize то у тебя все должно прекрасно получиться
Возможно, но мне все же интересно, как сделать параллельный доступ. К томуже, того же результата можно добиться и крит. секцией.
← →
Serginio (2003-03-12 12:30) [127]Беда локальных БД в том, что одновременное чтение и запись влияют на результаты чтения. Для того, чтобы прочитанные данные были абсолютно верны на конец чтения надо прменять MultiReadExclusiveWriteSinchronizer.
Скорее я и не прав на счет "Однозначно BDE не следит за записями в файл", но у меня такой вопрос
а Как ты представляешь паралельную запись в файл??? Она может быть только последовательной!!!. А применяя синхронизацию ты облегчаешь задачу BDE так как ей не нужно следить за блокировками на уровне файловой системы и возможными при этом задержками и инертностью.Плюс не исключены разного рода ошибки в BDE. Делай выводы
← →
ki11er (2003-03-12 13:53) [128]
> а Как ты представляешь паралельную запись в файл
Ну, если дойти до уровня головок/секторов/цилиндров и при условии, что у нас один обыкновенные винчестер, то imho никак.
Но если так рассуждать, то и самый навороченный SQL тоже пишет последовательно ;-))), однако при этом не валится ;-)
← →
Soft (2003-03-12 15:25) [129]Привет.
1) Что такое школа Ю.Зотова?
2) При многопоточности во время обращения к базе помогает метод Synchronize (почитай в хелпе TThread). При использовании данного метода происходит переключение в однопоточность на время работы процедуры и глюки просто исчезают.
3) Если хочешь чтоб за тебя многопоточность обрабатывала БД то юзай полный SQL сервер(IB, Oracle, ASA, MS Sql ....)
4) Killer ты или гений который произведет революцию в программировании или полный идиот. Эти две крайности различает только успех.
5) Советую читать не книги а хелпы, мануалки, высказывания людей... Слушай всех, выбирай сам
← →
Serginio (2003-03-12 15:48) [130]Про SQL почему ты думаешь, что на сервере не испльзуются критические секции и тому подобное. Как раз скорей всего и используются это дешевле и намного ускоряет работу. Еще раз повторю, что при записи лимитирующей стадией является перестроение индекса. Если не запретить одновременный доступ к таблицам с одинаковым индексом то получишь,что у тебя. А в разные таблицы ты и на локальных машинах пиши сколько душе угодно.
← →
ki11er (2003-03-12 16:05) [131]2 Soft:
> Что такое школа Ю.Зотова?
Не знаю, и в принципе не особо хочу знать
> При многопоточности во время обращения к базе помогает метод
> Synchronize (почитай в хелпе TThread). При использовании
> данного метода происходит переключение в однопоточность
> на время работы процедуры и глюки просто исчезают.
"Переключение в однопоточность" - это круто ;-)))
Посмотри на досуге, как на самом деле работает Synchronize. Лично у меня в правилах записано, не использовать эти вызовы, кроме случаев, когда это действительно необходимо. Боюсь, опять завяжется пустой спор, но imho использование sinchronize чревато последствиями.
> Killer ты или гений который произведет революцию в программировании
> или полный идиот. Эти две крайности различает только успех.
флейм
> Советую читать не книги а хелпы, мануалки, высказывания
> людей... Слушай всех, выбирай сам
Спасибо, конечно, за совет. ;-)
← →
ki11er (2003-03-12 16:13) [132]2 Serginio:
> Про SQL почему ты думаешь, что на сервере не испльзуются
> критические секции и тому подобное.
Я так и не думаю... С чего ты взял?
> Еще раз повторю, что при записи лимитирующей стадией является
> перестроение индекса.
Я не спорю, возможно. Но где про это написано?
← →
Soft (2003-03-12 16:56) [133]To Killer
Основное правило корректной работы многозадачных систем - задачи должны быть разделены по данным, памяти и управлению.
Ты в свой программе нарушил все три этих правила.
← →
Serginio (2003-03-12 17:14) [134]Посмотри для пимера как устроены индексы
http://www.1c.hippo.ru/cgi-bin/predownl.cgi?id=2019
И станет ясно, что критическим является перестроение Индекса.
А написано ЗДЕСЬ. Ты хоть попробовал синхронизировать потоки???
← →
ki11er (2003-03-12 17:15) [135]
> Основное правило корректной работы многозадачных систем
> - задачи должны быть разделены по данным, памяти и управлению.
>
> Ты в свой программе нарушил все три этих правила.
Ага, в одной задаче нарушил все правила многозадачности :-D
Да будет Вам известно, что потоки внутри процесса работают в одном адресном пространстве.
Замечания о том, что я нарушил прошу форматировать так:
строка кода
описание, что нарушено(какие правила, и т.п.)
источник информации(хэлп, мануал, ...), место в источнике, где про это написано(объясняется как надо/не надо делать)
← →
ki11er (2003-03-12 17:42) [136]
> Посмотри для пимера как устроены индексы
> http://www.1c.hippo.ru/cgi-bin/predownl.cgi?id=2019
Я представляю, как могут быть устроены индексы. Но в данном случае меня интересуют не индексы вообще, а как это реализовано в BDE в частности (формат файла и код, который с этим работает)
> И станет ясно, что критическим является перестроение Индекса.
Я ж сказал, что не спорю. Пусть будет критическим ;-) Но отсюда совсем не следует, что все должно валиться...
← →
Mike Kouzmine (2003-03-12 17:53) [137]По законам дискусси, утверждающая сторона должна приводить свои аргументы. Ты утверждаешь что у тебя все правильно - аргументируй. А то получается "У вас синий нос, докажите что не синий, ну не синий, а зеленый, докажите, что нет"
Ты расслабся и избавься от своей идеи фикс, а то, что она фикс, ясно всем, кроме тебя. И взгляни на проблему с другой стороны.
Проще будет.
← →
Serginio (2003-03-12 17:58) [138]Бде закрытая система и многие вещи познаются путем проб и ошибок как в твоем случае . Принцип понятен, а как конкретно это реализовано в BDE тебе никто не скажет кроме самих разработчиков.
Еще раз спрошу "Ты хоть попробовал синхронизировать потоки???"
← →
ki11er (2003-03-12 18:31) [139]
> Ты утверждаешь что у тебя все правильно - аргументируй.
8-O Где? Где Вы это прочитали/увидели/услышали?
Я только лишь говорю, что в соответствии с хелпом и др. документами (см. выше). Но раз неработает, - значит что-то неправильно. Но что?
> "Ты хоть попробовал синхронизировать потоки???"
Засинхронизировать потоки не составляет труда. Думаю, при этом станет работать более стабильно (насколько более - не известно, возможно даже сбоев вообще не будет). Но это будет другое решение другой задачи.
> Бде закрытая система и многие вещи познаются путем проб
> и ошибок как в твоем случае .
Я пока что стараюсь следовать тому, что написано в документации... Возможно потом придется заняться "шаманством", если нормальные способы не помогут.
← →
Serginio (2003-03-12 18:59) [140]Попробуй inherited Create(True);
А затем
for i:=0 to 10 do begin
TableThreads[i].resume
end;
← →
ki11er (2003-03-12 19:13) [141]
> Попробуй inherited Create(True);
> ...
Был и такой вариант...
А что это меняет? Насколько я понимаю, - ничего.
Страницы: 1 2 3 4 вся ветка
Форум: "Базы";
Текущий архив: 2003.03.31;
Скачать: [xml.tar.bz2];
Память: 0.96 MB
Время: 0.01 c