![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
---|Ветка была без названия|---
ki11er © (2003-03-04 21:11:00)приведенный ниже код валится через пару минут работы с сообщениями "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 13:55:00) [121]
> Прочитал весь код ко конца и недоумение усилилось.
> Создается ОДНО таблица с первичным ключем и 2-мя неуникальными
> индексами. Затем создается 11 (!!!) компонентов TTable,
> каждая из которых связывается с "личной" сессией, создаваемой
> тут же геморным способом (без обид), каждая со своим приват
> и в общий net каталоги.
Это не я придумал. "дэлфийный хэлп" + "a paradox table survival guid for c++ builder and delphi developers".
>Затем на каждую таблу выполняется
> однотипное разовое действие (в коде - вставка ОДНОЙ И ТОЙ
> ЖЕ ЗАПИСИ !),
Насчет одной и той же - это опять "описка"? ;-)
Хотя это не существенно, пусть даже и одной и той же...
> Да, и еще по поводу AutoInc. В парадоксе с этим типом полей,
> да еще определенным как ЕДИНСТВЕННЫЙ PK, следует работать
> чрезвычайно осторожно, т.к. в ПАРАДОКСЕ НЕТ ПОЛНОЦЕННЫХ
> ГЕНЕРАТОРОВ и BDE не гарантирует УНИКАЛЬНОСТЬ предоставляемого
> ею значения !
> Особенно это опасно при одновременной вставке несколькими
> юзерами (у тебя-потоками)
Я об этом знаю. Но опять же в данном случае это не существенно...
ermserg (2003-03-05 13:50:00) [122]> А то опять глупые вопросы начнутся
Eto hamstvo.
ki11er (2003-03-05 13:49:00) [123]
> И будет глючить. Т.к.невозможно придумать НОРМАЛЬНУЮ конструкцию
> автомобиля с квадратными колесами.
Имеется в виду, что на связке Delphi+BDE+Paradox это принципиально не должно работать? Тогда почему в хэлпах пишут, что должно?
MsGuns (2003-03-05 13:48:00) [124]>ki11er (05.03.03 13:44)
>В данном случае это несущественно.
Смотрим бабушку дальше ?
ki11er (2003-03-05 13:44:00) [125]
> 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:31:00) [126]>ermserg © (05.03.03 13:23)
Мое ИМХО: кадр разрезал бабушку, посмотрел, охренел. А теперь удивляется, почему бабушка не готовит ему обед ;)))))
MsGuns (2003-03-05 13:27:00) [127]>ki11er (05.03.03 13:13)
Да-да-да. Именно так. Для конкурирующих коннектов. Т.е. если есть необходимость обращаться к одной и той же БД (не обязательно таблице - это могут быть разные таблицы, и не только таблицы, а, к примеру, ХП или представления), например из двух разных модулей приложения, то, чтобы они "не мешали" друг другу, заводим на каждую свою сессию, чтоб сервер их обслуживал параллельно (кстати, каждый мало-мальски нормальный сервер имеет понятие ТРАНЗАКЦИЯ, которое куда эффективей БДЕ-шной сессии).
Вопрос, какое это отношение имеет к Парадоксу ? У него нет СЕРВЕРА.
Читаем далее
multiple net files for Paradox
Предположив, что Вы знаете, что означает net-файл для парадокса, спрашиваю:
У вас что, несколько лицензионных версий Парадокса с группой своих юзеров для каждого ? Т.е.несколько БД, каждая из которых имеет свой net-файл и "своих" пользователей ? И Вам надо одновременно работать сразу с несколькими такими БД ? Если так, то из приведенного Вами кода этого не видно.
ermserg (2003-03-05 13:23:00) [128]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:14:00) [129]>ermserg © (05.03.03 13:05)
Совершенно "в дырочку" !
В справке по этой переменной и соотв.компоненте так и написано, что разработчик сам несет всю ответственность за создание и уничтожение созданных им сессий.
Лично я вообще не видел пока необходимости создавать доп.сессии в приложении. Для оптимизации работы с БД (скорость, надежность и т.д.) существуют много других, гораздо более эффективных способов. Правда, если приложение работает с РАЗНЫМИ типами БД через BDE, то тогда, возможно, параллирование алгоритмики обмена с разными БД и имеет какой-то смысл. Но в приведенном примере вообще используется ЕДИНСТВЕННАЯ таблица. Какое распараллирование ? Для чего ? Типа разрезать бабушку и посмотреть что внутри ?
ki11er (2003-03-05 13:13:00) [130]
> Что, нельзя создать 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:06:00) [131]>ki11er (05.03.03 13:00)
>Но пока дело до этого не дошло, т.к. начало глючить в самом начале :-((((((((((
И будет глючить. Т.к.невозможно придумать НОРМАЛЬНУЮ конструкцию автомобиля с квадратными колесами.
>придумать задачу для которой это может понадобится
Разве что придумать для нее спец. "квадратные" дороги ? :))))
ermserg (2003-03-05 13:05:00) [132]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?
ki11er (2003-03-05 13:00:00) [133]Да, забыл...
> И не лишне все же было бы ответить на вопрос о необходимости
> распараллеливания доступа к ОДНОЙ И ТОЙ ЖЕ ТАБЛИЦЕ.
Вы имеете в виду, придумать задачу для которой это может понадобится? Думаю это не составит труда. А запись в таблицу - только частный случай. Вообще планировалось делать еще и другие операции (удаление, модификация ...). Но пока дело до этого не дошло, т.к. начало глючить в самом начале :-((((((((((
MsGuns (2003-03-05 12:57:00) [134]Прочитал весь код ко конца и недоумение усилилось.
Создается ОДНО таблица с первичным ключем и 2-мя неуникальными индексами. Затем создается 11 (!!!) компонентов TTable, каждая из которых связывается с "личной" сессией, создаваемой тут же геморным способом (без обид), каждая со своим приват и в общий net каталоги. Затем на каждую таблу выполняется однотипное разовое действие (в коде - вставка ОДНОЙ И ТОЙ ЖЕ ЗАПИСИ !), после чего изменения "сохраняются" в таблицу. (В кавычках потому что если будет ttRead, то сохранение чего ?).
Наверное, есть в подобной технике что-то сермяжное, но я, убей, не пойму - НА ФИГА НАДО ОДЕВАТЬ ТРУСЫ ЧЕРЕЗ ГОЛОВУ ?
Что, нельзя создать 11 курсоров на ОДНУ И ТУ ЖЕ ТАБЛИЦУ в рамках одной сессии ? И сто, все 11 буду вот так одновременно писать в ОДНУ ТАБЛИЦУ ? Тогда почему нельзя сделать ОДНИМ запросом вставку (удпление/изменеие) ?
Короче - лес темный !
Да, и еще по поводу AutoInc. В парадоксе с этим типом полей, да еще определенным как ЕДИНСТВЕННЫЙ PK, следует работать чрезвычайно осторожно, т.к. в ПАРАДОКСЕ НЕТ ПОЛНОЦЕННЫХ ГЕНЕРАТОРОВ и BDE не гарантирует УНИКАЛЬНОСТЬ предоставляемого ею значения !
Особенно это опасно при одновременной вставке несколькими юзерами (у тебя-потоками)
ki11er (2003-03-05 12:49:00) [135]
> Отличить могу. В данном случае "чтение" просто описка. Имелось
> в виду слово "обращение". Если же не нужна моя помощь, то
> нет проблем.
ок. описка так описка. помощь нужна, иначе не постил бы ;-)
> советую все же почитать о 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:21:00) [136]>ki11er (05.03.03 11:40)
>Если вы не можете отличить запись от чтения, думаю, вряд ли сможете помочь в данном случае.
Отличить могу. В данном случае "чтение" просто описка. Имелось в виду слово "обращение". Если же не нужна моя помощь, то нет проблем.
>Это из личного опыта или где-то документировано
Это "документировано" в многочисленных хэлпах и примерах в книжках. Использование этой компоненты избавляет от многих проблем, в частности необходимость "движку" указывать ТИП и ВЕРСИЮ формата, путь ко ВСЕМ ипользуемым таблицам и запросам и т.д. Кроме того, через методы TDataBase (и ему подобных для SQL-серверных БД типа IB) можно получать и делать много чего полезного. Например, узнавить состав и структуры таблиц, блокировать ВСЕ таблицы за раз и т.д.
Прежде чем хаить кого бы то ни было за то, что он, По Вашему мнению, не ПОМОГ В ДАННОЙ КОНКРЕТНОЙ СИТУАЦИИ (типа не сказал в какой строке кода ошибка), советую все же почитать о TDatabase, особенно если Вы работаете с BDE и парадоксом
И не лишне все же было бы ответить на вопрос о необходимости распараллеливания доступа к ОДНОЙ И ТОЙ ЖЕ ТАБЛИЦЕ.
ki11er (2003-03-05 11:40:00) [137]2 MsGuns:
Если вы не можете отличить запись от чтения, думаю, вряд ли сможете помочь в данном случае.
Этот код - просто тест. И его великий смысл проверить все, что тут и в других местах говорится на практике.
> Во-вторых, прежде чем манипулировать TSession советую заюзать
> TDatabase
Это из личного опыта или где-то документировано?
MsGuns (2003-03-05 11:25:00) [138]Бог мой, а накручено-то !
Скажи, пжлста, какой великий смысл каждый раз при запуске создавать БД ? А где проверка, что она уже создана ?
Во-вторых, прежде чем манипулировать TSession советую заюзать TDatabase, создавть алиас, куда загонять нужные параметры для формата Парадокс (рекомендую TSession.AddStandardAlias)
А, главное, не понятен СМЫСЛ всей этой байды (многопоточное чтение одной только что созданной таблы)
ki11er (2003-03-05 11:15:00) [139]Посмотрите, внимательно на код ;-)
Таблица создается при старте программы (перед стартом я все удаляю).
Одно уточнение, в соответствии с хелпом заменил строку
Session := TSession.Create(nil);
на
_FSession := Sessions.OpenSession("Session" +
IntToStr(integer(@_FSession)) +
IntToStr(GetTickCount));
Но это ничего не изменило. ;-(((
WellSlava (2003-03-05 11:09:00) [140]Сколько записей в базе?