Dúvida tempo de persistência de um objeto estático

14 respostas
augustocolom

Olá,

Pessoal , estou com uma dúvida, talvez seja simples para alguns mas o problema é o seguinte. Tenho um sistema que roda em três camadas: Camada de apresentação (que seria minhas páginas JSP mesmo), uma camada que liga a Camada de apresentação com minhas classes java (Servlets), e a terceira camada, que uso para persistir dados. Essa camada que persiste os dados possui um ArrayList statico. Bom, a dúvida é a seguinte, quando faço a inserção dos objetos na ArrayList, ela fica até determinado tempo na memória, aonde eu posso gerar relatórios baseado nela, mas chega um determinado tempo que os dados da ArrayList somem, existe alguma regra que posso controlar esse tempo?

abraço

14 Respostas

rogelgarcia

Acho que tá rolando uma confusão aí… não existe tempo de sobrevivencia dos objetos no arraylist… eles ficam lá… até nao tem nenhuma referencia mais para eles…

O que pode tá acontecendo… é que em determinado local do seu programa… vc está insntanciando o objeto que guarda o arraylist denovo…

Assim, o objeto que contia os dados… é perdido… dando lugar ao novo objeto… que tem o arraylist vazio…

É uma hipótese…

F

Posta o código da classe que contém o seu arraylist.
E o código dos servlets que o acessam.

augustocolom

rogelgarcia:
Acho que tá rolando uma confusão aí… não existe tempo de sobrevivencia dos objetos no arraylist… eles ficam lá… até nao tem nenhuma referencia mais para eles…

O que pode tá acontecendo… é que em determinado local do seu programa… vc está insntanciando o objeto que guarda o arraylist denovo…

Assim, o objeto que contia os dados… é perdido… dando lugar ao novo objeto… que tem o arraylist vazio…

É uma hipótese…

Então Rogel,
Eu realmente insiro o objeto da ArrayList<> com um add mesmo, as vezes reutilizo essa arraylist em outros lugares, mas de qualquer forma ela fica armazenada na memória… abaixo segue o código de um Servlet e da classe que adiciona os objetos…
Servlet

package servlets;

import java.io.IOException;
import java.util.ArrayList;

import javabeans.Banco;
import javabeans.Marca;
import javabeans.Modelo;
import javabeans.Veiculo;
import javabeans.VeiculoOnibus;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ServletCaminhao
 */
public class ServletOnibus extends HttpServlet
{
	private static final long serialVersionUID = 1L;
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ServletOnibus()
    {
        super();
    }
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		processar(request, response);
	}
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		processar(request, response);
	}
	/**
	 * Faz o processamento da requisição
	 * 
	 * @param request Requisição HTTP
	 * @param response Resposta do Servlet
	 * @throws ServletException
	 * @throws IOException
	 */
	private void processar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		String operacao	= request.getParameter("ope");
		String url = "/index.jsp";
		
		if (operacao.equals("regonibus"))
		{
			url = incluirCarro(request, response);
		}
		else if (operacao.equals("relonibus"))
		{
			url = relatorioOnibus(request, response);
		}
		ServletContext sc = getServletContext();
		RequestDispatcher rd = sc.getRequestDispatcher(url);
		rd.forward(request, response);
	}
	/**
	 * Inclui um novo carro e retorna a URL com a página de sucesso na inclusão
	 * 
	 * @param request Requisição HTTP
	 * @param response Resposta do Servlet
	 * @return A url da página de sucesso
	 * @throws ServletException
	 * @throws IOException
	 */
	private String incluirCarro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		//Veiculo
		int id = 0;
		String cor = "";
		int numeroChassi = 0;
		String numeroPlaca = "";
		int idModelo = 0;
		String descricaoModelo = "";
		int idMarca = 0;
		String descricaoMarca = "";
		//VeiculoCarro
		int numeroPassageiros= 0; 
		String itinerario = "";
		try {
			id = Integer.parseInt(request.getParameter("id"));
			cor = request.getParameter("cor");
			numeroChassi = Integer.parseInt(request.getParameter("numerochassi"));
			numeroPlaca = request.getParameter("numeroplaca");
			//modelo
			idModelo = Integer.parseInt(request.getParameter("idmodelo"));
			descricaoModelo = request.getParameter("descricaomodelo");
			//marca
			idMarca = Integer.parseInt(request.getParameter("idmarca"));
			descricaoMarca = request.getParameter("descricaomarca");
			//exclusivo onibus
			numeroPassageiros = Integer.parseInt(request.getParameter("numeropassageiros"));
			itinerario = request.getParameter("itinerario");
		}
		catch (NumberFormatException nfe) {
			request.setAttribute("erro", nfe);
		}
		catch (NullPointerException nlfe) {
			request.setAttribute("erro", nlfe);
		}

		VeiculoOnibus onibus = new VeiculoOnibus();
		Marca marca = new Marca();
		Modelo modelo = new Modelo();
		
		onibus.setId(id);
		onibus.setCor(cor);
		onibus.setNumeroChassi(numeroChassi);
		onibus.setNumeroPlaca(numeroPlaca);
		//exclusivo onibus
		onibus.setNumeroPassageiros(numeroPassageiros);
		onibus.setItinerario(itinerario);
		//Marca que o modelo possui
		marca.setId(idMarca);
		marca.setDescricaoMarca(descricaoMarca);
		//Modelo 
		modelo.setId(idModelo);
		modelo.setDescricaoModelo(descricaoModelo);
		modelo.setMarca(marca);
		//Adiciona objeto modelo ao setModelo
		onibus.setModelo(modelo);
		Banco.incluirVeiculo(onibus);
		return "/okonibus.jsp";
	}
	/**
	 * Gera um relatório de ônibus, e retorna a URL da página
	 * 
	 * @param request Requisição HTTP
	 * @param response Resposta do Servlet
	 * @return A URL para redirecionamento
	 * @throws ServletException
	 * @throws IOException
	 */
	private String relatorioOnibus(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		//Atribuir a nova ArrayList somente VeiculoCaminhão
		ArrayList<Veiculo> vetorOnibus = new ArrayList<Veiculo>();
		//Obs, se o objeto acima for VeiculoCaminhao, deve ser feito o Cast 
		for (int i = 0; i < Banco.getVeiculo().size(); i++) {
			if (Banco.getVeiculo().get(i) instanceof VeiculoOnibus) {
				vetorOnibus.add(Banco.getVeiculo().get(i));
			}
		}
		request.setAttribute("onibus", vetorOnibus); //Objeto implícito de Servlets, armazena somente do escopo de requisição
		return "/relonibus.jsp";
	}
}
package javabeans;
import java.util.ArrayList;
/**
 * Banco de dados utilizado na aplicação
 * 
 * @author Grupo
 */
public class Banco 
{
	static ArrayList<Veiculo> vetorVeiculos = new ArrayList<Veiculo>();
	/**
	 * Recebe objeto do tipo Veículo e insere em uma ArrayList
	 * @param veiculo
	 */
	public static void incluirVeiculo(Veiculo veiculo)
	{
		vetorVeiculos.add(veiculo);
		mostraVeiculo();
	
	}
	/**
	 * Função de debug para exibir o ID do veículo
	 */
	public static void mostraVeiculo()
	{
		for (int i = 0; i < vetorVeiculos.size(); i++) {
			System.out.println(vetorVeiculos.get(i).getId());
		}
	}
	/**
	 * Pega o vetor de veículos
	 * @return ArrayList O vetor com os veículos cadastrados
	 */
	public static ArrayList<Veiculo> getVeiculo()
	{
		return vetorVeiculos;
	}
}
rogelgarcia

E quando é que os objetos “somem”?

augustocolom

Então, essa é minha dúvida…
Eu compilo aqui minha interface Web, e insiro os objetos, eles ficam lá, mas depois de um tempo quando gero o relatório não tem mais nada,

rogelgarcia

As vezes o erro pode tá no jsp…

augustocolom

Então, na verdade não sei se está com erro, acredito que exista algum lugar que se pode especificar isso, estilo quando criamos sessões… bom, vou pesquisar ve se acho alguma coisa…

valeu pela ajuda

F

Se vc ficar muito tempo sem fazer requests, pode ser que a session expire.
Com a session expirada, os valores setados nas variáveis estáticas são perdidos.
Isto porque a session é o que mantém a ligação entre o host servidor e o host cliente.

Pode ser isto q está acontecendo. Mas por default a session tem um timeout de 30 minutos (pelo menos no tomcat).
Vc fica este tempo todo parado?

augustocolom

fvslistas:
Se vc ficar muito tempo sem fazer requests, pode ser que a session expire.
Com a session expirada, os valores setados nas variáveis estáticas são perdidos.
Isto porque a session é o que mantém a ligação entre o host servidor e o host cliente.

Pode ser isto q está acontecendo. Mas por default a session tem um timeout de 30 minutos (pelo menos no tomcat).
Vc fica este tempo todo parado?

Então, eu não estou usando Sessão, ArrayList estática mesmo, eles ficam armazenados na memória, de uma olhada ali em cima no código como faço os request…

F

Entendi.

rogelgarcia

Nào cara… a sessão nao controla os objetos estáticos nao…

augustocolom

É, acho que resolvi… a lista de objetos estáticos fica de pé até que eu derrube meu servidor.

Obrigado a todos por ajudarem.

rogelgarcia

Cara … eu até pensei nisso… mas num achei que vc ia dar essa manota…

hahahahah

:smiley:

augustocolom

rogelgarcia:
Cara … eu até pensei nisso… mas num achei que vc ia dar essa manota…

hahahahah

:D

hehehe, disfarça. Pede pra caga e sai.

valeu bixo

Criado 27 de maio de 2010
Ultima resposta 31 de mai. de 2010
Respostas 14
Participantes 3