Connexção com banco de dados Oracle

4 respostas
A

Foi desenvolvido uma aplicação Web Application em java com banco de dados oracle 10g e tomcat 5.5 ambos rodando em servidores linux. No tomcat foi configurado um usuário de conexção com o oracle confore configuração abaixo:

Arquivo configurado no XML do Tomcat:

<Resource name="jdbc/prodDB" auth="Container"
 type="javax.sql.DataSource"
 driverClassName="oracle.jdbc.OracleDriver"
 url="jdbc:oracle:thin:@192.163.0.160:1521:orcl" username="USER_PRD"
 password="123125" maxActive="150" maxIdle="600" maxWait="-1" />

Tem dia que o servidor de aplicação/Tomcat trava, aqui começa a minha dúvida, com a configuração do Tomcat conforme acima, posso permitir que mais ou menos cento e vinte usuário acessem a aplicação com este mesmo usuário? Ou deveria existir cadastrado no banco de dados oracle todos os usuários e cada usuário teria sua própria connexção no Tomcat/oracle.

Desde já agradeço a boa vontade de todos. Estarei a disposição de todos para quaisquer ajuda que por ventura vierem a precisar.

4 Respostas

S

Bom Dia!

Olha, você pode utilizar o mesmo usuário sim, sem problemas. Eu acho que o que tá pegando são duas coisas: primeiramente os valores que você está utilizando, e o fato de você não estar fechando nunca as conexões “abandonadas”.
Segundo o que eu sempre escutava quando estava começando a configurar o meu pool e pedia ajuda ao pessoal, 600 conexões é um número gigantesco de conexões inativas. Se não me engano o Oracle consegue gerenciar bem até 500 conexões (entre ativas e inativas, porém não estou certo disto).

Eu tambem tive problemas em dimensior o meu pool. Todo mundo fala “nossa, esse número é muito grande, você precisa dimensionar melhor”, mas na hora que eu peço uma sugestão, ninguem sabe afirmar nada…
Desta forma, eu ainda estou fazendo vários testes com valores diferentes para tentar achar parametros adequados à minha situação (você terá que adequar a sua).

No meu caso, tenho normalmente (fora do horário de pico) por volta de 50 usuários simultâneos, e obtive bons resultados - lembrando que não é apenas o número de usuários que vai definir o seu pool, existem n outros fatores. De qualquer forma, vou sugerir alguns valores e outros parâmetros para você começar a testar, e depois você vai alterando adptando à sua necessidade:

  • Diminuir o número MaxIdle. (vou sugerir para você no máximo 10)
  • Colocar o parâmetro MinIdle, para que você possa ter sempre algumas conexões abertas dísponíveis aos usuários (sugiro começar com 5.Isto mesmo, apenas 5!)
  • Sugiro também utilizar o parâmetro RemoveAbandoned não esquecendo do removeAbandonedTimeout para definir o tempo necessario para remover as conexões que nao estão sendo utilizadas (até atingir o mínimo que você especificou no MinIdle)
    Existem outros parâmetros que você pode utilizar também.Depois dê uma olhada em: http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html#Database%20Connection%20Pool%20(DBCP)%20Configurations
    Enfim, para configurar bem o seu pool, você terá que observar o comportamento dos seus usuários, se eles costumam fazer operações muito pesadas, se a carga é heterogênea ou homogênia, o volume da carga, se eles fazem muitas ou poucas querys, se elas são demoradas ou não, etc…
    Eu ainda não acabei de resolver meus problemas com o pool, mas já obtive melhoras. Espero que isto te ajude a começar!
    Abraços!

ps.: O Parâmetro InitialSize, não sei porque, não funciona comigo.

H

você tem servidor Tomcat então porque você esta precupado?, não é clientes que vai entrar na database Oracle, um usario que vai entrar ( USER_PRD) e Tomcat que vai compartilhar informaçãoes.

S

Sobre o RemovedAbandonedTimeout(conforme vc me perguntou em privado):

Como é o funcionamento da sua aplicação?

  • As pessoas precisam se logar nela ou o acesso é publico?
  • Os usuários executam consultas que são demoradas por natureza? (uma boa idéia é se basear no tempo das maiores consultas)

Ou seja, infelizmente, não há como falar genericamente. Se vc colocar um tempo muito baixo, você pode prejudicar os usuários.

Além disso não é vantagem o pool ficar abrindo e fechando conexões o tempo todo (isto custa processamento do servidor e um pouco do banco também!).

Por um outro lado, acho que nenhum usuário vai ficar esperando mais do que 10~15 minutos por uma resposta, então caso isto aconteça, é bem provável que a conexão já possa ser liberada para outro.

Mas aí vem uma outra pergunta: Você utiliza a aplicação para gerar relatórios? Porque aí a coisa muda um pouco de figura…

Consegue perceber o que deve ser levado em conta??

Após analisar os items acima, tente estimar um tempo, vamos supor: 600(10 minutos). Então você tente testar para saber se as conexões estão sendo liberadas antes do tempo ou não (pode ser apenas que uma consulta esteja demorando para responder, como em um relatório por exemplo).

Acho que o caminho é mais ou menos por aí. Se alguem tiver mais algo à acrescentar…

Abraços!

S

Pessoal, desculpem dar ress nesse tópico, mas me fizeram algumas perguntas por mp e acho melhor responder por aqui por dois motivos:

  • Pode ser que eu esteja errado, nesse caso alguem me corrija.
  • Pode ser que esta dúvida seja comum a outras pessoas.

Estou implementando tb.
o context.xml eu configurei assim

<?xml version="1.0" encoding="UTF-8"?>

Vc acha legal esta configuração?

Bom, é um pouco dificil falar assim genericamente. Como eu disse la no tópico, isso depende de vários fatores (tamanho da sua aplicação, finalidade da sua aplicação - é um portal público, um sistema interno…?? - , do numero de usuários acessando…) .

Está bem parecido com a configuração que eu uso para um sistema de médio porte…

Eu só achei estranho isso aqui:
removeAbandonedTimeout=“5” Isso são 5 segundos, eu acho pouco tempo…! Os usuários não tem sessão no seu sistema?

Qualquer dúvida dê uma olhada aqui (tem outros parâmetros que você pode usar também):
http://commons.apache.org/dbcp/configuration.html

Outra dúvida, quando usava o JDBC eu fecho todas as conexões com o Connection.close(), com este poll tenho tb que fechar?

tipo assim

Connection conn = null;

Statement st = null;

ResultSet rs = null;

// Obtém a raiz da hierarquia de nomes
InitialContext ctx = new InitialContext();

// Obtém a origem dos dados
DataSource ds =
(DataSource) ctx.lookup(“java:comp/env/jdbc/blahblah”);

// Retorna a conexão

conn = ds.getConnection();

()

// Fecho a conexão

conn.close();

Seria necessário?

SIM !!! Não esqueça de jeito nenhum de fechar as conexões, senão não tem como o container “saber” que um usuário já finalizou a sua operação no banco e retornar esta mesma conexão para outro usuário do pool.

Isto porque por debaixo dos panos o tomcat é que tem o controle direto das conexões, ele apenas disponibiliza uma interface para você trabalhar como se fosse diretamente com o banco. Ou seja, internamente o tomcat sabe que quando você dá um .close() você não está fechando a conexão com o banco, mas apenas deixando de usar uma interface que o tomcat te disponibiliza e consequentemente, por debaixo dos panos, liberando aquela conexão para outro.

Existem meios de você acessar a conexão com o banco diretamente através de alguns parâmetros de configuração no arquivo de contexto, mas isso pode ser bem perigoso se você não souber controlar direito.
Lembre-se que você não está implementando o seu próprio pool “na mão”, então deixe que o tomcat resolva esses problemas para você. :wink:

Criado 19 de janeiro de 2007
Ultima resposta 14 de jul. de 2008
Respostas 4
Participantes 3