Pessoal,
Trabalho no desenvolvimento/manutenção de um ERP [1], 100% Web, para Órgãos
Públicos Municipais (Prefeituras, Câmaras, Autarquias, etc...), e estou
efetuando alguns testes com pgbouncer [2] e PostgreSQL 8.2 e estou bastante
satisfeito com os resultados até o momento.
Amigos, antes que falem qualquer coisa sobre a versão do PostgreSQL que
estou usando já respondo que estamos adaptando a aplicação em função dos
casts implicitos que foram removidos, e optei por ajustar a aplicação ao
invés de recriá-los.
Estou utilizando o pgbouncer com o modo do pool como "session_pooling", em
função de tabelas temporárias que mantenho durante a sessão PostgreSQL, e
implementei uma PL para emular o comando DISCARD ALL [3], presente apartir
da versão 8.3, para colocar a sessão no seu estado inicial. O DISCARD ALL
[3], conforme documentação, executa os seguintes comandos na ordem que
segue:
- SET SESSION AUTHORIZATION DEFAULT;
- RESET ALL;
- DEALLOCATE ALL;
- CLOSE ALL;
- UNLISTEN *;
- SELECT pg_advisory_unlock_all();
- DISCARD PLANS;
- DISCARD TEMP;
Destes comandos não consegui implementar o DISCARD PLANS (se alguém souber
como faço isso, e se é possível, eu agradeço).
Com base nisso tenho uma dúvida (até mais desconfiança que dúvida mesmo) que
tenho é relacionada a essa PL que implementei (em anexo), pois configurei
ela no parâmetro "server_reset_query", assim como o pgbouncer [2] indica pra
fazer com o DISCARD ALL, e apesar de estar em testes com resultados
positivos há algum tempo em nosso ambiente de desenvolvimento ainda tenho
receio de colocar em produção.
Tenho esse receio pois fazemos uso intenso de tabelas temporárias, por
sessão, em nossa aplicação e estas são críticas para o correto funcionamento
da mesma...
Estou testando o pgbouncer desde ter assistido uma palestra do colega Euler
no PgDay/RS [4]. Também conversei com ele sobre o pgbouncer e nesta conversa
fiquei muito motivado a fazer uso da ferramenta, tanto é que na
segunda-feira após o evento já estava com o pgbouncer em testes nos nossos
servidores de testes (hehehe).
Desde lá tive esses inconvenientes com tabelas temporárias e, aparentemente,
resolvi com a PL... mas isso não será impressão minha, pois uma coisa é um
ambiente de testes com meia dúzia de usuários e outra coisa é o sistema em
produção com algumas dezenas ou centenas de usuários simulatâneos...
A documentação do pgbouncer não é grande coisa, por isso estou aqui cheio de
receios... será que estou indo pelo caminho certo ou existe algum outro
"porém" nessa estória??? Ou será que o mais seguro é aguardar e utilizar o
pgbouncer somente em conjunto do PostgreSQL 8.3???
Agradeço a paciência dos colegas pela extensão do e-mail, mas quis ser o
mais claro possível.
[1] http://pt.wikipedia.org/wiki/Enterprise_resource_planning
[2] https://developer.skype.com/SkypeGarage/DbProjects/PgBouncer
[3] http://www.postgresql.org/docs/8.3/interactive/sql-discard.html
[4] http://www.postgresql.org.br/eventos/pgday/rs
Cordialmente,
--
Fabrízio de Royes Mello
>> Blog sobre PostgreSQL: http://fabriziomello.blogspot.com
create or replace function fc_discard_all() returns void as
$$
declare
rComando record;
iVersao integer;
begin
select sum(
pg_catalog.substring(
pg_catalog.split_part(
pg_catalog.current_setting(
'server_version'
),
'.',
i
),
'^[[:digit:]]+'
)::numeric * 10^(6-i*2)
)::integer as server_version_integer
into iVersao
from generate_series(1,3) as s(i);
if iVersao >= 80300 then
execute 'discard all';
return;
end if;
set session authorization default;
reset all;
if iVersao >= 80200 then
for rComando in
select name
from pg_prepared_statements
loop
execute 'deallocate '||rComando.name;
end loop;
for rComando in
select name
from pg_cursors
where name !~ '^<unnamed'
loop
execute 'close '||rComando.name;
end loop;
end if;
unlisten *;
if iVersao >= 80200 then
perform pg_advisory_unlock_all();
end if;
for rComando in
select distinct
table_schema
from information_schema.tables
where table_type = 'LOCAL TEMPORARY'
loop
execute 'drop schema '||quote_ident(rComando.table_schema)||' cascade';
end loop;
return;
end;
$$
language plpgsql;
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral