Artigo SQL Magazine 39 - Pool de conexões, monitoração, segurança e auditoria com Oracle

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (0)  (0)

Artigo da Revista SQL Magazine - Edição 39.

Clique aqui para ler todos os artigos desta edição

Pool de conexões, monitoração, segurança e auditoria com Oracle

 

Pool de conexões, ou connection pooling, é uma técnica utilizada para otimizar o uso dos recursos associados a uma conexão de banco de dados.  Nesta técnica, o servidor de aplicações gerencia uma coleção de conexões de banco de dados para servir os diversos usuários de um sistema.  O uso do pool de conexões tem dois objetivos principais. O primeiro é escalabilidade, uma vez que permite o compartilhamento de um número menor de conexões físicas para atender às requisições de conexões de uma aplicação. Esse compartilhamento é possível com o uso do tempo ocioso de uma conexão para atender outras requisições da aplicação.  Desta forma, temos um relacionamento 1:N, onde uma conexão física pode atender N conexões lógicas.

O  segundo objetivo é performance, já que minimiza o elevado custo para se estabelecer conexões com o banco de dados.  Esse elevado custo é referente à necessidade de alocação memória, criação de um processo servidor e uma série de recursos necessários para o estabelecimento de uma conexão com o banco de dados.  O pool de conexões minimiza esse custo ao manter, sempre, conexões pré-estabelecidas, sem que seja necessário abrir e fechar, repetidamente, as conexões físicas com banco de dados.

Por outro lado, o aspecto negativo do uso de pool de conexões  para o banco de dados é que, como todas as conexões são feitas utilizando um mesmo usuário de banco de dados, cujo nível de privilégios é normalmente alto, o banco de dados e/ou DBA não tem conhecimento de qual usuário da aplicação está usando,  efetivamente, cada sessão. Dessa forma, a monitoração e auditoria das atividades da aplicação, utilizando os recursos do banco de dados podem ficar comprometidas (podem por que existe um mecanismo que utilizamos para lidar com esta limitação). Além dos aspectos de segurança, monitoração e auditoria, vale lembrar ainda que, com freqüência, é necessário re-implementar funcionalidades que o Oracle já oferece, o que representa um custo desnecessário.

 

Figura 1. Quem está, de fato, utilizando cada conexão com o banco de dados?

 

O Oracle oferece duas alternativas que permitem resolver o problema e responder à pergunta da Figura 1. Utilizando o parâmetro de contexto da sessão CLIENT_IDENTIFIER ou utilizando autenticação através de PROXY USERS. Assim, a aplicação pode informar à camada de banco de dados qual usuário está, de fato, utilizando cada conexão física no banco de dados. Dessa forma, é possível utilizar os recursos de segurança, auditoria e monitoração do banco de dados, sem a necessidade de abrir mão dos benefícios do pool de conexões.

Client_identifier

Nesse método, ao solicitar uma conexão ao pool de conexões, a aplicação deve atribuir à variável de contexto da sessão CLIENT_IDENTIFIER o identificador do usuário da aplicação, o que permite a identificação do usuário da aplicação enquanto ele estiver utilizando a conexão.  Não se pode esquecer que, antes de devolver a conexão ao pool de conexões, a aplicação deve limpar essa informação, para informar que a conexão não está mais sendo utilizada.

A utilização desse método é aconselhável nos casos onde a aplicação já foi desenvolvida utilizando pool de conexões com um único usuário de banco de dados ou quando a aplicação tem muitos usuários e não se quer manter, no banco de dados, cada usuário real da aplicação.

A package (pacote) pré-defenida DBMS_SESSION é utilizada, neste método, para manipular a variável CLIENT_IDENTIFIER. Na Listagem 1, temos um exemplo de como usar o CLIENT_IDENTIFIER em Java.

 

conn = pooled.getConnection();

 

String bloco = "BEGIN  DBMS_SESSION.SET_IDENTIFIER ('CARLOS'); END; ";

Statement up = conn.createStatement();

up.executeUpdate(bloco);

bloco = "BEGIN  DBMS_SESSION.CLEAR_IDENTIFIER; END; ";

up = conn.createStatement();

up.executeUpdate(bloco);

up.close();

conn.close();

Listagem 1. Definindo o CLIENT_IDENTIFIER em Java.

 

Uma boa prática é estender o pool de conexões para evitar que algum desenvolvedor desatento esqueça de definir o usuário da aplicação ao solicitar a conexão ao pool de conexões, e nem esqueça de limpar o valor do CLIENT_IDENTIFIER quando a aplicação devolver essa conexão ao pool. Neste caso, o método getConnection deverá receber um parâmetro com o valor do usuário da aplicação (ver "

A exibição deste artigo foi interrompida :(
Este post está disponível para assinantes MVP

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?