Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA9 Prepared Statements - когда происходит высвобождение ресурсов под Prepared Statements / 10 сообщений из 10, страница 1 из 1
07.09.2005, 20:29
    #33257433
IgorCCS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA9 Prepared Statements - когда происходит высвобождение ресурсов под Prepared Statements
После того как выполнился запрос через ADOQuery (Delphi) происходит увеличения счётчика на величины PrepStmt(Подготовленные операторы) и CursorOpen (Открытые курсоры).

После работы с данными выполняется закрытие ADOQuery.Close и очистка текста запроса ADOQuery.Sql.Clear.
Но значения PrepStmt и CursorOpen не уменьшается если смотреть через
SELECT *
FROM sa_conn_properties() p join sa_conn_info() c on p.number=c.number
WHERE PropNum in (89,92) and CommLink='local'
ORDER BY PropNum, value;
ну и в итоге если в программе полазить по всем окнам, то в какой-то момент на 1 коннекте окажется 50 Prepared Statements.
Получим ошибку.
Конечно можно увеличить Max_cursor_count и Max_statements_count, но ведь это не лучший выход. Ведь приложение по любому будет дорабатываться (и не исключено, что и 100 Max_cursor_count/Max_statements_count не хватит если они не будут высвобождаться) и зачем нагружать сервер.

Причём заметил что PrepStmt увеличивается не в сам момент открытия ADOQuery, а при занесении текста запроса Sql.Add('...') на закрытом ADOQuery. А вот CursorOpen только при его открытии.
Соответсвенно по логике первый должен освобождаться через Sql.Clear, а второй через Close; но этого не происходит...

Спасибо...
...
Рейтинг: 0 / 0
07.09.2005, 21:43
    #33257490
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA9 Prepared Statements - когда происходит высвобождение ресурсов под Prepared Statements
TADOQuery.Prepared := false;
...
Рейтинг: 0 / 0
08.09.2005, 09:24
    #33257781
IgorCCS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA9 Prepared Statements - когда происходит высвобождение ресурсов под Prepared Statements
Prepared=false не помогает.

http://] with dmSprav.adoqOverheads do
begin
Close;
ShowMessage(BoolToStr(Prepared));
sql.Clear;
ShowMessage(BoolToStr(Prepared));
sql.Add('...');
ShowMessage(BoolToStr(Prepared));
Open;
end;

Все сообщения говорят что ADOQuery не Prepared. И сразу после строки sql.Add('...') происходит увеличение счётчика подготовленых выражений.

В BOL по этому поводу вот что:
Each time a statement is sent to a database, the server must first prepare the statement. Preparing the statement can include:

Parsing the statement and transforming it into an internal form.
Verifying the correctness of all references to database objects by checking, for example, that columns named in a query actually exist.
Causing the query optimizer to generate an access plan if the statement involves joins or subqueries.
Executing the statement after all these steps have been carried out.

но есть и такое:
DROP STATEMENT statement [ESQL]
--------------------------------------------------------------------------------
Description
Use this statement to free statement resources.
Syntax
DROP STATEMENT [ owner.]statement-name
statement-name : identifier | hostvar
Usage
The DROP STATEMENT statement frees resources used by the named prepared statement. These resources are allocated by a successful PREPARE statement, and are normally not freed until the database connection is released.

Неужели все так запущено??? Как мне имя его то получить???
...
Рейтинг: 0 / 0
08.09.2005, 18:11
    #33259677
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA9 Prepared Statements - когда происходит высвобождение ресурсов под Prepared Statements
IgorCCS
но есть и такое:
DROP STATEMENT statement [ESQL]
.....
Неужели все так запущено??? Как мне имя его то получить???
Да, есть и такое. Но это ESQL и это имя никак не получить, потому что ты используешь ADO а не ESQL. Разные принципы работы знаете-ли.

Вообще, по идее ADO позволяет управлять подготовленностью запросов. В описании ADO объекта Command, в проперти Prepared даже есть пример как один и тот же запрос выполняется с подготовкой и без. А впрочем вот, я тут поигрался слегка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
option explicit
dim oConn, oCmd1, oCmd2, oCmdStatus, oRS

set oConn = CreateObject("ADODB.Connection")
set oCmd1 = CreateObject("ADODB.Command")
set oCmd2 = CreateObject("ADODB.Command")
set oCmdStatus = CreateObject("ADODB.Command")

oConn.Open("DSN=ASA 9.0 Sample")

oCmdStatus.ActiveConnection = oConn
oCmdStatus.CommandText = "SELECT connection_property(" & chr( 39 ) & "PrepStmt" & chr( 39 ) & ") as PrepStmt, connection_property(" & chr( 39 ) & "CursorOpen" & chr( 39 ) & ") as CursorOpen"
WScript.StdOut.Write "After status request created: "
call ShowCounts

oCmd1.ActiveConnection = oConn
oCmd1.CommandText = "select count(*) from DBA.employee"
WScript.StdOut.Write "First command created: "
call ShowCounts

oCmd2.ActiveConnection = oConn
oCmd2.CommandText = "select count(*) from DBA.employee"
WScript.StdOut.Write "Second command created: "
call ShowCounts

oCmd2.Prepared = true
WScript.StdOut.Write "Second command Prepared=true: "
call ShowCounts

set oRS = oCmd1.Execute
WScript.StdOut.Write "First command executed: "
call ShowCounts

oRS.Close
WScript.StdOut.Write "First command result set closed: "
call ShowCounts

set oRS = oCmd2.Execute
WScript.StdOut.Write "Second command executed: "
call ShowCounts

oRS.Close
WScript.StdOut.Write "Second command result set closed: "
call ShowCounts

oCmd2.Prepared = false
WScript.StdOut.Write "Second command Prepared=false: "
call ShowCounts

set oRS = nothing
WScript.StdOut.Write "Result set object destroyed: "
call ShowCounts

set oCmd1 = nothing
WScript.StdOut.Write "First command object destroyed: "
call ShowCounts

set oCmd2 = nothing
WScript.StdOut.Write "Second command object destroyed: "
call ShowCounts


sub ShowCounts
	dim oRSStatus
	set oRSStatus = oCmdStatus.Execute
	WScript.StdOut.WriteLine "PrepStmt=" & oRSStatus("PrepStmt") & " CursorOpen=" & oRSStatus("CursorOpen")
	oRSStatus.Close
end sub

Создаешь файл CheckNumberOfPreparedRequests.vbs, кладешь туда этот исходник, запускаешь через cscript CheckNumberOfPreparedRequests.vbs и наслаждаешься :) Потом попробуй повторить это на дельфях и сам поймешь что надо делать чтобы не плодить подготовленные запросы.
...
Рейтинг: 0 / 0
09.09.2005, 10:55
    #33260595
IgorCCS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA9 Prepared Statements - когда происходит высвобождение ресурсов под Prepared Statements
А ну да ESQL...
Это по идее д.б. где нибудь в ключах запуска сервера или в св-х самой базы, по крайней мере так это на Оракле решается сказали... А вот в ASA найти такое не получилось....
...
Рейтинг: 0 / 0
09.09.2005, 10:59
    #33260603
IgorCCS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA9 Prepared Statements - когда происходит высвобождение ресурсов под Prepared Statements
Ну всё таки каждый запрос проходит через prepared...

ASA Programming Guide
Using SQL in Applications
Preparing statements

Each time a statement is sent to a database, the server must first prepare the statement. Preparing the statement can include:

Вот только как заставить его это забыть???
...
Рейтинг: 0 / 0
09.09.2005, 17:28
    #33261960
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA9 Prepared Statements - когда происходит высвобождение ресурсов под Prepared Statements
IgorCCSА ну да ESQL...
Это по идее д.б. где нибудь в ключах запуска сервера или в св-х самой базы, по крайней мере так это на Оракле решается сказали... А вот в ASA найти такое не получилось....
Чего? Какие ключи? Никаких ключей не нужно.
Ты мой пример запускал? Вывод его рассматривал? Нет? А зря! Он очень красноречивый, там есть ответы на все твои вопросы :)
...
Рейтинг: 0 / 0
09.09.2005, 17:34
    #33261979
IgorCCS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA9 Prepared Statements - когда происходит высвобождение ресурсов под Prepared Statements
А где взять можно cscript?
...
Рейтинг: 0 / 0
09.09.2005, 17:48
    #33262007
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA9 Prepared Statements - когда происходит высвобождение ресурсов под Prepared Statements
IgorCCSА где взять можно cscript?
У тебя Windows 2000 или выше есть? Значит и cscript у тебя тоже есть :)
Для всех остальных виндов и документацию на wsh брать здесь: http://msdn.microsoft.com/library/default.asp?url=/downloads/list/webdev.asp
...
Рейтинг: 0 / 0
09.09.2005, 18:31
    #33262090
IgorCCS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA9 Prepared Statements - когда происходит высвобождение ресурсов под Prepared Statements
Спасибо за сприпт. С ним разобрался.
А вот на Delphi вот что получается (в скобочках PrepStat-OpenCur после данной команды).

with dmSprav.adoq do
begin
Close;
(0-0)
Prepared:=false;
(0-0)
sql.Clear;
(0-0)
sql.Add('...);
(1-0)
Open;
(1-1)

Close;
(1-1)
Prepared:=false;
(1-1)
sql.Clear;
(1-1)
sql.Add('...);
(1-0)
Open;
(1-1)
end;
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA9 Prepared Statements - когда происходит высвобождение ресурсов под Prepared Statements / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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