Servlets não persistem muito tempo na memória

Tenho um servidor rodando Conectiva Linux, JDK 1.4 e Tomcat 4.1.18.
Tenho uma página JSP que instancia uma variavel compartilhada chamada con com uma conexão para um banco Firebird. Acontece que a cada submissão à página, um novo objeto con é criado, mesmo este sendo compartilhado. Parece que o servlet não persiste na memória muito tempo, e a cada submissão é carregado novamente criando assim um novo objeto con.
Pra piorar, quando uma nova conexão é criada um novo processo interserver é criado no servidor. Há um limite no numero destes processos que podem rodar simultaneamente, que este caso eh 120. Como a cada submissao uma nova conexao eh criada , um novo processo interserver eh criado tambem, chegando rapidamente no limite. Mesmo se fechar a conexao na página (con.close()) o processo interserver não é liberado imediatamente.

Será que o problema do servlet não persistir eh alguma configuracao no Tomcat ?

Talvez tenha algo errado no modo como você declarou a sua conexão.
Esses dias mesmo criei uma variável de classe static dentro de um servlet e não tive problema nenhum de perdê-la após várias requests.
Meu Tomcat está com a configuração padrão.
Sugiro que você coloque seu código aqui.

Eh, tem que ver onde vc declarou essa “variavel compartilhada”, e como e onde vc esta iniciando ela.

Rafael

Basicamente, o comportamento que você descreveu pode acontecer se você tiver feito o servlet implementar a interface SingleThreadModel

Se o problema for com seu código… você pode considerar a hipótese de utilizar um pool de conexões ou algo parecido :wink:

Mande seu código pra galera poder opinar :wink:

Abraços!

Beleza, vou descrever de forma simplificada como está o código :

A variavel con esta declarada dentro da tag de declaração e é inicializada dentro do metodo jspInit(). Ela é inicializada através do método getConnection definido na propria página , que por sua vez usa um método chamado getConnection de um objeto chamado commands.
A página está defina com isThreadSafe = “true” .

Eu testei uma outra coisa agora a pouco. Eu mandei imprimir o valor o objeto con e ele permanece o mesmo entre as varias solicitacoes, o que indica que nao esta sendo criado um novo objeto em cada solicitacao. Mas entao, por quê um novo processo interserver eh criado logo após a submissao da página ? Eu achava que cada interserver estava relacionado com um objeto con instanciado na aplicacao, e não fosse criado um cada vez que a conexao fosse utilizada, que parece ser o que esta acontecendo.

<%!

public java.sql.Connection con;

public void jspInit () {

getConnection(false);

 }

public void jspDestroy () {
   try {
    con.close();
   }
   catch (Exception e){}  	
}

public String getConnection(boolean commit) {
try{
if ((con == null) || (con.isClosed() == true))
{
con = commands.getConnection(banco,commit);
}
}
catch (Exception e){return (“Não foi possível estabelecer conexão com o banco !!”);}
return ("");
}

%>

Abraços, e obrigado.