Форум: "Базы";
Текущий архив: 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
:))) Вот и я о том же! Начитаются всякой ерунды - многопоточность-многозадачность, мутексы-шмутексы, комы-дкомы и другой хр... фигни, потом делают все через... пути неисповедимые. И удивляются - почему это у них все работает "не так"? Эти мне "продвинутые"...
Гвозди электронным микроскопом тоже можно забивать, но молотком - оно по-проще...
Многопоточность (как мультизадачность) в системах "нереального" времени - хохма, придуманная хохмачами. Правда сейчас это модно, статеек в нете лежит много. Вот народ и думает, что "это хорошо".
Страницы: 1 2 3 4 вся ветка
Форум: "Базы";
Текущий архив: 2003.03.31;
Скачать: [xml.tar.bz2];
Память: 0.62 MB
Время: 0.008 c