Erros no console

Aparentemente o sistema esta funcionando, de vez em quando da erro de mysql “too many connections” mas acho q não é esse o problema

03/11/2011 16:01:53 org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: .:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java
03/11/2011 16:01:53 org.apache.tomcat.util.digester.SetPropertiesRule begin
AVISO: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:sistaxi' did not find a matching property.
03/11/2011 16:01:53 org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
03/11/2011 16:01:53 org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
03/11/2011 16:01:53 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 1200 ms
03/11/2011 16:01:53 org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
03/11/2011 16:01:53 org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.21
ServletContextListener started
Thread Thread-4 iniciada com sucesso!
thread aberta, vou entrar no while=true e sou a thread: Thread-4
Thread reiniciando....
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
03/11/2011 16:01:56 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
03/11/2011 16:01:56 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
03/11/2011 16:01:56 org.apache.catalina.startup.Catalina start
INFO: Server startup in 2941 ms
calculei a distancia que é: 0.1402797736367815
achei o taxi mais perto, serialgps: 901200016 - status bloqueado
Thread reiniciando....
03/11/2011 16:02:14 org.apache.catalina.core.ApplicationDispatcher invoke
GRAVE: Servlet.service() for servlet jsp threw exception

Error on line 69, column 13 in template/simple/select.ftl
stack.findValue('top') is undefined.
It cannot be assigned to itemKey
The problematic instruction:
----------
==> assignment: itemKey=stack.findValue('top') [on line 69, column 13 in template/simple/select.ftl]
 in user-directive s.iterator [on line 59, column 1 in template/simple/select.ftl]
----------

Java backtrace for programmers:
----------
freemarker.core.InvalidReferenceException: Error on line 69, column 13 in template/simple/select.ftl
stack.findValue('top') is undefined.
It cannot be assigned to itemKey
	at freemarker.core.Assignment.accept(Assignment.java:111)
	at freemarker.core.Environment.visit(Environment.java:208)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:208)
	at freemarker.core.IfBlock.accept(IfBlock.java:82)
	at freemarker.core.Environment.visit(Environment.java:208)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:208)
	at freemarker.core.Environment.visit(Environment.java:297)
	at freemarker.core.UnifiedCall.accept(UnifiedCall.java:130)
	at freemarker.core.Environment.visit(Environment.java:208)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:208)
	at freemarker.core.Environment.process(Environment.java:188)
	at freemarker.template.Template.process(Template.java:237)
	at org.apache.struts2.components.template.FreemarkerTemplateEngine.renderTemplate(FreemarkerTemplateEngine.java:182)
	at org.apache.struts2.components.UIBean.mergeTemplate(UIBean.java:559)
	at org.apache.struts2.components.UIBean.end(UIBean.java:513)
	at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:42)
	at org.apache.jsp.jsp.geraCorridaPage_jsp._jspx_meth_s_005fselect_005f1(geraCorridaPage_jsp.java:939)
	at org.apache.jsp.jsp.geraCorridaPage_jsp._jspx_meth_s_005fform_005f2(geraCorridaPage_jsp.java:882)
	at org.apache.jsp.jsp.geraCorridaPage_jsp._jspService(geraCorridaPage_jsp.java:173)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
	at org.apache.struts2.dispatcher.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:154)
	at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
	at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:361)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:265)
	at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:163)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:249)
	at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:148)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:93)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:128)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
	at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:148)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:128)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
	at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
	at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468)
	at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
	at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:680)
03/11/2011 16:02:14 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [default] in context with path [/sistaxi] threw exception
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
	at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:443)
	at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:725)
	at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:485)
	at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
	at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:680)
	
	
	
	
		at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:135)
	at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:80)
	at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:323)
	at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:475)
	at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:133)
	at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:84)
	at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:295)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1385)
	at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
	at br.com.sistaxi.hibernate.FabricaDeSessao.abreSessao(FabricaDeSessao.java:21)
	at br.com.sistaxi.hibernate.Dao.getCorridaPorStatus(Dao.java:158)
	at br.com.sistaxi.auxiliar.ThreadCorrida.run(ThreadCorrida.java:51)
03/11/2011 16:08:32 org.apache.catalina.loader.WebappClassLoader loadClass
INFO: Illegal access: this web application instance has been stopped already.  Could not load br.com.sistaxi.beans.Taxi.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1564)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1523)
	at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:187)
	at org.hibernate.mapping.PersistentClass.getMappedClass(PersistentClass.java:122)
	at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertyGetter(PojoEntityTuplizer.java:299)
	at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:158)
	at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:77)
	at sun.reflect.GeneratedConstructorAccessor17.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:107)
	at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:135)
	at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:80)
	at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:323)
	at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:475)
	at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:133)
	at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:84)
	at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:295)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1385)
	at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
	at br.com.sistaxi.hibernate.FabricaDeSessao.abreSessao(FabricaDeSessao.java:21)
	at br.com.sistaxi.hibernate.Dao.getCorridaPorStatus(Dao.java:158)
	at br.com.sistaxi.auxiliar.ThreadCorrida.run(ThreadCorrida.java:51)
03/11/2011 16:08:32 org.apache.catalina.loader.WebappClassLoader loadClass
INFO: Illegal access: this web application instance has been stopped already.  Could not load br.com.sistaxi.beans.Taxi.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1564)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1523)
	at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:187)
	at org.hibernate.mapping.PersistentClass.getMappedClass(PersistentClass.java:122)
	at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertySetter(PojoEntityTuplizer.java:306)
	at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:159)
	at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:77)
	at sun.reflect.GeneratedConstructorAccessor17.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:107)
	at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:135)
	at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:80)
	at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:323)
	at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:475)
	at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:133)
	at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:84)
	at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:295)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1385)
	at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
	at br.com.sistaxi.hibernate.FabricaDeSessao.abreSessao(FabricaDeSessao.java:21)
	at br.com.sistaxi.hibernate.Dao.getCorridaPorStatus(Dao.java:158)
	at br.com.sistaxi.auxiliar.ThreadCorrida.run(ThreadCorrida.java:51)

desculpe um post seguido do outro, mas estava dando erro too long message

essa é a unica classe que faz o erro acontecer

package br.com.sistaxi.controle.action;

import java.util.ArrayList;
import java.util.List;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

import br.com.sistaxi.auxiliar.ListaCorridaAtiva;
import br.com.sistaxi.beans.Cliente;
import br.com.sistaxi.beans.Corrida;
import br.com.sistaxi.beans.Taxi;
import br.com.sistaxi.hibernate.Dao;

import com.google.gson.Gson;

public class GeraCorridaAction {

	private Dao dao = new Dao();
	private String mensagem;
	private double distancia;
	private ArrayList<Taxi> listaTaxi = new ArrayList<Taxi>();
	private Taxi taxi = new Taxi();
	private double latitude;
	private double longitude;
	private double menorDistancia;
	private Taxi proximoTaxi = new Taxi();
	private String menorDistanciaStr;
	private String funcao;
	private Cliente cliente = new Cliente();
	private Corrida corrida = new Corrida();
	private String corridaObservacao;
	private List<Corrida> listaCorrida = new ArrayList<Corrida>();
	private List<Corrida> listaCorridaAtiva = new ArrayList<Corrida>();
	private List<Corrida> listaCorridaSemTaxi = new ArrayList<Corrida>();
	private ListaCorridaAtiva listaCorridaAtivaMemoria = new ListaCorridaAtiva();
	private String listaJson;


	@Action(value = "/gerarCorrida", results = {
			@Result(name = "goListarCliente", location = "/jsp/listarClientePage.jsp"),
			@Result(name = "goGeraCorrida", location = "/jsp/geraCorridaPage.jsp"),
			@Result(name = "goRefreshCorridaAtiva", location = "/jsp/ajax/listaCorridaAtivaPage.jsp"),
			@Result(name = "goRefreshCorridaSemTaxi", location = "/jsp/ajax/listaCorridaSemTaxiPage.jsp"),
			@Result(name = "recursivo", type = "redirectAction",  
	        location = "gerarCorrida.action") ,
			@Result(name = "goLogin", location = "/index.jsp") })
	public String execute() {

		// Função iniciar uma nova corrida
		if ("gerarCorrida".equals(funcao)) 
		{
			dao.salva(cliente);
			corrida.setCliente(cliente);
			corrida.setSituacao("sem taxi");
			dao.salva(corrida);
			//listaCPT.adiciona(corrida);
//			try{
//			if(!threadCorrida.isAlive())
//			{
//				threadCorrida.start();
//			}
//			}catch (Exception e) {
//				System.out.println(e);
//			}
			//orridaUnica.start();
			return "recursivo";
		
		}
		// se a função for cancelar corrida
		if ("cancelarCorrida".equals(funcao)) {
			// carrega todos os dados da corrida selecionada pelo id
			corrida = (Corrida) dao.getCorridaById(corrida.getId());
			// altera o status da corrida para cancelada
			corrida.setSituacao("cancelada");
			corrida.getTaxi().setStatus("livre");
			// faz update na corrida
			mensagem = dao.salva(corrida);
		}
		//aqui a corrida é cancelada antes de ganhar um taxi, assim não altera 
		//o status do taxi q ainda não existe evitando gerar um erro
		if ("cancelarCorridaSemTaxi".equals(funcao)) {
			// carrega todos os dados da corrida selecionada pelo id
			corrida = (Corrida) dao.getCorridaById(corrida.getId());
			// altera o status da corrida para cancelada
			corrida.setSituacao("cancelada");
			// faz update na corrida
			mensagem = dao.salva(corrida);
		}

		// ao selecionar um cliente na combobox, pegar todos os dados no banco
		if ("clienteSelecionado".equals(funcao)) {
			// carrega as informações do cliente selecionado no combobox pelo
			// nome
			cliente = (Cliente) dao.getClienteByNome(cliente);
		}


		if ("refreshCorridaAtiva".equals(funcao)) {

			listaCorridaAtiva = dao.getCorridaPorStatus("ativa");
			//listaCorridaAtiva = (List<Corrida>) listaCorridaAtivaMemoria;

			return "goRefreshCorridaAtiva";
		}
		// se estiver buscando alterações nos estados das corridas sem taxi por ajax
		if ("refreshCorridaSemTaxi".equals(funcao)) {


			listaCorridaSemTaxi = dao.getCorridaPorStatus("sem taxi");
			//listaCorridaSemTaxi= (List<Corrida>) listaCPT;

			return "goRefreshCorridaSemTaxi";
		}

		// o codigo abaixo roda independentemente do comando que vier do jsp
		//utilizado para passar dados padrão para a tela que gera corrida
		// gera uma lista com todos os clientes
		listaCliente = dao.listarCliente(cliente);
		listaClienteTelefone = dao.listarCliente(cliente);
		
		//converte para json para que o autocomplete funcione
		Gson gson = new Gson();
		setListaJson(gson.toJson(listaCliente));

		return "goGeraCorrida";

	}


	public String getMensagem() {
		return mensagem;
	}

	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}

	public double getDistancia() {
		return distancia;
	}

	public void setDistancia(double distancia) {
		this.distancia = distancia;
	}

	public ArrayList<Taxi> getListaTaxi() {
		return listaTaxi;
	}

	public void setListaTaxi(ArrayList<Taxi> listaTaxi) {
		this.listaTaxi = listaTaxi;
	}

	public Taxi getTaxi() {
		return taxi;
	}

	public void setTaxi(Taxi taxi) {
		this.taxi = taxi;
	}

	public double getLatitude() {
		return latitude;
	}

	public void setLatitude(double latitude) {
		this.latitude = latitude;
	}

	public double getLongitude() {
		return longitude;
	}

	public void setLongitude(double longitude) {
		this.longitude = longitude;
	}

	public double getMenorDistancia() {
		return menorDistancia;
	}

	public void setMenorDistancia(double menorDistancia) {
		this.menorDistancia = menorDistancia;
	}

	public Taxi getProximoTaxi() {
		return proximoTaxi;
	}

	public void setProximoTaxi(Taxi proximoTaxi) {
		this.proximoTaxi = proximoTaxi;
	}

	public String getMenorDistanciaStr() {
		return menorDistanciaStr;
	}

	public void setMenorDistanciaStr(String menorDistanciaStr) {
		this.menorDistanciaStr = menorDistanciaStr;
	}

	public String getFuncao() {
		return funcao;
	}

	public void setFuncao(String funcao) {
		this.funcao = funcao;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public ArrayList<Cliente> getListaCliente() {
		return listaCliente;
	}

	public void setListaCliente(ArrayList<Cliente> listaCliente) {
		this.listaCliente = listaCliente;
	}

	public Corrida getCorrida() {
		return corrida;
	}

	public void setCorrida(Corrida corrida) {
		this.corrida = corrida;
	}

	public String getCorridaObservacao() {
		return corridaObservacao;
	}

	public void setCorridaObservacao(String corridaObservacao) {
		this.corridaObservacao = corridaObservacao;
	}

	public List<Corrida> getListaCorrida() {
		return listaCorrida;
	}

	public void setListaCorrida(List<Corrida> listaCorrida) {
		this.listaCorrida = listaCorrida;
	}

	public String getListaJson() {
		return listaJson;
	}

	public void setListaJson(String listaJson) {
		this.listaJson = listaJson;
	}
	public List<Corrida> getListaCorridaAtiva() {
		return listaCorridaAtiva;
	}

	public void setListaCorridaAtiva(List<Corrida> listaCorridaAtiva) {
		this.listaCorridaAtiva = listaCorridaAtiva;
	}

	public List<Corrida> getListaCorridaSemTaxi() {
		return listaCorridaSemTaxi;
	}

	public void setListaCorridaSemTaxi(List<Corrida> listaCorridaSemTaxi) {
		this.listaCorridaSemTaxi = listaCorridaSemTaxi;
	}
	


	public ListaCorridaAtiva getListaCorridaAtivaMemoria() {
		return listaCorridaAtivaMemoria;
	}

	public void setListaCorridaAtivaMemoria(
			ListaCorridaAtiva listaCorridaAtivaMemoria) {
		this.listaCorridaAtivaMemoria = listaCorridaAtivaMemoria;
	}
	private ArrayList<Cliente> listaCliente = new ArrayList<Cliente>();
	private ArrayList<Cliente> listaClienteTelefone = new ArrayList<Cliente>();
	public ArrayList<Cliente> getListaClienteTelefone() {
		return listaClienteTelefone;
	}

	public void setListaClienteTelefone(ArrayList<Cliente> listaClienteTelefone) {
		this.listaClienteTelefone = listaClienteTelefone;
	}

}

minha classe dao

package br.com.sistaxi.hibernate;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

import br.com.sistaxi.beans.Cliente;
import br.com.sistaxi.beans.Corrida;
import br.com.sistaxi.beans.Taxi;
import br.com.sistaxi.beans.Usuario;

public class Dao {
	private Session session;
	private String mensagem;
	private FabricaDeSessao fabricaDeSessao = new FabricaDeSessao();
	private Corrida corrida = new Corrida();
	private Taxi taxi = new Taxi();

	public String salva(Object objeto) {
		try {
			session = fabricaDeSessao.abreSessao();
			session.saveOrUpdate(objeto);
			fabricaDeSessao.fechaSessao(session);
			return "Informação salva com sucesso!";
		} catch (Exception e) {

			mensagem = "Erro: " + e;
			return mensagem;
		}

	}

	public boolean validaLogin(Usuario usuario) {
		session = fabricaDeSessao.abreSessao();
		Criteria select = session.createCriteria(usuario.getClass());
		select.add(Restrictions.eq("login", usuario.getLogin()));
		select.add(Restrictions.eq("senha", usuario.getSenha()));
		if (select.list().isEmpty()) {
			fabricaDeSessao.fechaSessao(session);
			return false;
		} else {
			fabricaDeSessao.fechaSessao(session);
			return true;
		}

	}

	@SuppressWarnings("unchecked")
	public ArrayList<Usuario> listaUsuario(Usuario usuario) {
		session = fabricaDeSessao.abreSessao();
		List<Usuario> lista = new ArrayList<Usuario>();
		lista = session.createCriteria(Usuario.class).list();
		fabricaDeSessao.fechaSessao(session);
		return (ArrayList<Usuario>) lista;

	}

	
	@SuppressWarnings("unchecked")
	public ArrayList<Taxi> listaTaxi(Taxi taxi) {
		session = fabricaDeSessao.abreSessao();
		List<Taxi> lista = new ArrayList<Taxi>();
		lista = session.createCriteria(Taxi.class).list();
		fabricaDeSessao.fechaSessao(session);
		return (ArrayList<Taxi>) lista;

	}

	public Object getById(Object objeto, int id) {
		// Usuario usuario = new Usuario();
		session = fabricaDeSessao.abreSessao();

		objeto = session.get(objeto.getClass(), id);
		fabricaDeSessao.fechaSessao(session);
		return objeto;

	}

	public Usuario getUsuarioByLoginSenha(Usuario usuario) {
		session = fabricaDeSessao.abreSessao();
		Criteria select = session.createCriteria(usuario.getClass());
		select.add(Restrictions.eq("login", usuario.getLogin()));
		select.add(Restrictions.eq("senha", usuario.getSenha()));
		usuario = (Usuario) select.list().get(0);
		fabricaDeSessao.fechaSessao(session);
		return usuario;
	}

	public String apaga(Object objeto) {
		try {
			session = fabricaDeSessao.abreSessao();
			session.delete(objeto);
			fabricaDeSessao.fechaSessao(session);
			return "Informação salva com sucesso!";
		} catch (Exception e) {

			mensagem = "Erro: " + e;
			return mensagem;
		}
	}

	public String atualiza(Object objeto) {
		// try {
		session = fabricaDeSessao.abreSessao();
		session.update(objeto);
		fabricaDeSessao.fechaSessao(session);
		return "Informação salva com sucesso!";
		// } catch (Exception e) {

		// mensagem = "Erro: " + e;
		// return mensagem;
		// }

	}

	@SuppressWarnings("unchecked")
	public ArrayList<Cliente> listarCliente(Cliente cliente) {
		session = fabricaDeSessao.abreSessao();
		List<Cliente> lista = new ArrayList<Cliente>();
		lista = session.createCriteria(Cliente.class).list();
		fabricaDeSessao.fechaSessao(session);
		return (ArrayList<Cliente>) lista;
	}

	public Object getClienteByNome(Cliente cliente) {
		session = fabricaDeSessao.abreSessao();
		Criteria select = session.createCriteria(Cliente.class);
		select.add(Restrictions.eq("nome", cliente.getNome()));
		cliente = (Cliente) select.list().get(0);
		fabricaDeSessao.fechaSessao(session);
		return cliente;

	}
	public Taxi getTaxiBySerialGps(String serial) {
		try{
		session = fabricaDeSessao.abreSessao();
		Criteria select = session.createCriteria(Taxi.class);
		select.add(Restrictions.eq("serialGps", serial));
		taxi = (Taxi) select.list().get(0);
		fabricaDeSessao.fechaSessao(session);
		return taxi;
		}catch (Exception e) {
			// TODO: handle exception
			for(int j=0;j<20;j++)
			System.out.println("Erro ao pegar dados do taxi pelo serial GPS"+e);
		}
		return taxi;

	}

	@SuppressWarnings("unchecked")
	public List<Corrida> getCorridaPorStatus(String status) {

		session = fabricaDeSessao.abreSessao();
		Criteria select = session.createCriteria(Corrida.class);
		select.add(Restrictions.eq("situacao", status));
		List<Corrida> lista = new ArrayList<Corrida>();
		lista = select.list();
		fabricaDeSessao.fechaSessao(session);
		
		return lista;

	}
	
	public Object getCorridaById(int id) {
		session = fabricaDeSessao.abreSessao();
		Criteria select = session.createCriteria(Corrida.class);
		select.add(Restrictions.eq("id", id));
		corrida = (Corrida) select.list().get(0);
		fabricaDeSessao.fechaSessao(session);
		return corrida;

	}
	public Taxi getTaxibyRt (String rt) {
		session = fabricaDeSessao.abreSessao();
		Criteria select = session.createCriteria(Taxi.class);
		select.add(Restrictions.eq("rt", rt));
		taxi = (Taxi) select.list().get(0);
		fabricaDeSessao.fechaSessao(session);
		return taxi;

	}
	@SuppressWarnings("unchecked")
	public ArrayList<Taxi> getTaxibyStatus (String status) {

		session = fabricaDeSessao.abreSessao();
		Criteria select = session.createCriteria(Taxi.class);
		select.add(Restrictions.eq("status", status));
		List<Taxi> lista = new ArrayList<Taxi>();
		lista =  select.list();
		fabricaDeSessao.fechaSessao(session);
		return (ArrayList<Taxi>) lista;

	}

	public String getMensagem() {
		return mensagem;
	}

	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}

	public Corrida getCorrida() {
		return corrida;
	}

	public void setCorrida(Corrida corrida) {
		this.corrida = corrida;
	}

	public Taxi getTaxi() {
		return taxi;
	}

	public void setTaxi(Taxi taxi) {
		this.taxi = taxi;
	}

}

Classe factory

package br.com.sistaxi.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

import br.com.sistaxi.beans.Cliente;
import br.com.sistaxi.beans.Corrida;
import br.com.sistaxi.beans.Taxi;
import br.com.sistaxi.beans.Usuario;

public class FabricaDeSessao {

	public Session abreSessao() {

		AnnotationConfiguration cfg = new AnnotationConfiguration();
		cfg.addAnnotatedClass(Cliente.class);
		cfg.addAnnotatedClass(Usuario.class);
		cfg.addAnnotatedClass(Taxi.class);
		cfg.addAnnotatedClass(Corrida.class);
		SessionFactory factory = cfg.buildSessionFactory();
		Session session = factory.openSession();
factory.close();
		session.beginTransaction();

		return session;

	}

	public void fechaSessao(Session session) {
		session.getTransaction().commit();
		session.flush();
		session.close();
		
	
	}
}

hibernate.properties (nao uso hibernate.xml)

[code]
  # hibernate.dialect = org.hibernate.dialect.MySQLInnoDBDialect
   hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
   hibernate.connection.driver_class = com.mysql.jdbc.Driver
   hibernate.connection.url = jdbc:mysql://localhost/sistaxi
   hibernate.connection.username = root
   hibernate.connection.password =1234
   hibernate.show_sql = false
   hibernate.format_sql = true
[/code]

classe q inicia a thread ao iniciar o servidor

package br.com.sistaxi.auxiliar;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
 
public class IniciaThread  implements ServletContextListener{
	static ThreadCorrida threadCorrida = new ThreadCorrida();
 
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		System.out.println("ServletContextListener destroyed");
	}
 
	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		System.out.println("ServletContextListener started");
		threadCorrida.start();
		System.out.println("Thread "+threadCorrida.getName()+" iniciada com sucesso!");
	}
}

web xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Sistaxi</display-name>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>
			org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <listener>
		<listener-class>br.com.sistaxi.auxiliar.IniciaThread</listener-class>
	</listener>
</web-app>

minha thread

package br.com.sistaxi.auxiliar;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import br.com.sistaxi.beans.Corrida;
import br.com.sistaxi.beans.Taxi;
import br.com.sistaxi.hibernate.Dao;

public class ThreadCorrida extends Thread {
	private Dao dao = new Dao();
	// private ListaCorridaProcurandoTaxi listaCPT = new
	// ListaCorridaProcurandoTaxi();
	// private ListaCorridaAtiva listaCorridaAtiva = new ListaCorridaAtiva();
	private ArrayList<Taxi> listaTaxi = new ArrayList<Taxi>();
	// private Taxi taxi = new Taxi();
	private CalculaDistancia cd = new CalculaDistancia();
	private double latitude;
	private double longitude;
	private double menorDistancia;
	private String menorDistanciaStr;
	private double distancia;
	// private Corrida corrida = new Corrida();
	private List<Corrida> listaCorrida = new ArrayList<Corrida>();
	private PowerHashMap powerHashMap = new PowerHashMap();

	@SuppressWarnings("static-access")
	public void run() {
		System.out
				.println("thread aberta, vou entrar no while=true e sou a thread: "
						+ this.currentThread().getName());
		while (true) {
			System.out.println("Thread reiniciando....");
			// enquanto existir clientes procuranto taxi
			// while (!listaCPT.estaVazia()) {

			// inicializa distancia
			distancia = 0;
			
			// raio máximo de busca
			menorDistancia = 50;
			
			// zera o taxi a ser selecionado
			Taxi proximoTaxi = new Taxi();
			
			//deixa o proximo taxi vazio
			proximoTaxi.setStatus("vazio");
			
			// pega as proximas corridas que procuram um taxi
			listaCorrida = dao.getCorridaPorStatus("sem taxi");
			
			//só executa o codigo abaixo se tiver cliente querendo taxi
			//caso contrario aguarda um sleep e volta para o inicio da thread
			if (!listaCorrida.isEmpty()) {
				for(int i=0;i<listaCorrida.size();i++)
				{

				// lista todos os taxis livres do sistema
				listaTaxi = dao.getTaxibyStatus("livre");
				
				//só executa o codigo abaixo se tiver taxi livre
				//caso contrario aguarda um sleep e volta para o inicio da thread
				if (!listaTaxi.isEmpty()) {
					
					// converte os dados que vieram da form (lat,long) como string para double
					latitude = Double.parseDouble(listaCorrida.get(i)
							.getCliente().getLatitude());
					longitude = Double.parseDouble(listaCorrida.get(i)
							.getCliente().getLongitude());

					// percorre todos os taxis procurando pelo mais proximo
					for (int j = 0; j < listaTaxi.size(); j++) {
						
						// chama a função que calcula a distancia entre o taxi e o cliente
						distancia = cd.btw(latitude, longitude, listaTaxi
								.get(j).getLatitude(), listaTaxi.get(j)
								.getLongitude());
						System.out.println("calculei a distancia que é: "
								+ distancia);
						

						//compara a distancia de cada carro e cliente, coloca taxi mais proximo
						//do cliente em proximoTaxi, isso só ocorre com taxis que nunca regeitaram
						//esta mesma corrida anteriormente, essa informação é obtida pelo powerHashMap
						if (
								(menorDistancia > distancia) 
								&& 
								(!powerHashMap.has(listaTaxi.get(j).getUsuario().getIdUsuario(),
										listaCorrida.get(i).getId()))
								&&
								(!"bloqueado".equals(listaTaxi.get(j).getStatus()))
							) 
						{
							menorDistancia = distancia;
							proximoTaxi = listaTaxi.get(j);

						}

					}//fim for procura taxi mais perto
					

					
					
					// se nao achou nenhum taxi, o status do taxi vai ser "vazio
					//sendo assim está thread deve voltar ao início e buscar novamente
					if (!"vazio".equalsIgnoreCase(proximoTaxi.getStatus())) {
						
						//descobre qual o index do carro mais proximo,
						//já alterando o status, evitando cair em sorteios antes da resposta do GPS
						listaTaxi.get(listaTaxi.indexOf(proximoTaxi)).setStatus("bloqueado");
						
						//altera também o status do proximo taxi, mesma questao acima
						proximoTaxi.setStatus("bloqueado");
						
						//apenas para escrever no console...
						System.out.println("achei o taxi mais perto, serialgps: "
								+ proximoTaxi.getSerialGps() + " - status "
								+ proximoTaxi.getStatus());
						
						// faz arredondamento das casas decimais caso eu queira futuramente
						//mostrar essa distancia
						DecimalFormat decimalFormat = new DecimalFormat();
						decimalFormat.setMaximumFractionDigits(1);
						setMenorDistanciaStr(decimalFormat
								.format(menorDistancia));
						
						// insere o taxi na corrida
						listaCorrida.get(i).setTaxi(proximoTaxi);
						
						//coloca o serial do GPS no status da corrida para que ela
						//não seja enviada pra mais ninguem antes de ter uma resposta do taxista
						listaCorrida.get(i).setSituacao(
								proximoTaxi.getSerialGps());
						
						//salva a corrida para que o gps possa busca-la no banco
						dao.salva(listaCorrida.get(i));

						
					}//fim if (achou algum carro livre e perto ? )
				  }//fim if lista de taxi esta vazia
				}//fim for listacorrida
			}//fim if lista corridas esta vazia
			try {
				//espera por um tempo pre determinado para não gerar bombardeio no banco
				//e evitar erros de concorrencia de thread
				sleep(10000);
			} catch (InterruptedException e) {
				//se tiver erro ao dormir, escreve no console
				e.printStackTrace();
				System.out.println(e);
				
			}//fim do catch

		}//fim do while(true)
	}//fim do metodo run

	public String getMenorDistanciaStr() {
		return menorDistanciaStr;
	}

	public void setMenorDistanciaStr(String menorDistanciaStr) {
		this.menorDistanciaStr = menorDistanciaStr;
	}

}