Problemas de leak no tomcat

4 respostas
P

Olá pessoal, tudo bem? Sou novo no JEE e estou precisando de uma dica. Estou criando um service web RESTful no tomcat usando jersey. Mas apareceu um problema que o problema de memoria
no tomcat que está armazenando cada objeto do meu serviço. Algum sabe como faco para destruir o objeto no final de cada requisição ?
O codigo de uma função abaixo:

@PersistenceUnit(unitName="cffpersistence")
	EntityManager em;
	
	@GET
	@Produces(MediaType.APPLICATION_JSON)
	@Path("/getFuncionarioCount")
	public Long getFuncionarioCount(){
		System.setProperty(Context.PROVIDER_URL, "C:\\Sistemas\\Temp");
		File f = new File(".\\teste.xml");
		
		try{
			if(f.createNewFile()==false){
				return -1L;
			}
		}catch(Exception ex){
			return -2L;
		}
		//EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("cffpersistence");
		//EntityManager em = emFactory.createEntityManager();
		Long size = (Long) em.createQuery("select COUNT(f.funSeq) from EcfFuncionarioEntity as f").getSingleResult();
		em.close();
		return size;
	}

Agradeço desde já.

4 Respostas

kaoe

Porque você esta criando um EntityManagerFactory em cada requisição?
Também não entendi o que o arquivo que você cria tem a ver com o retorno de um count?
Este código é só de testes ou ele realmente tem uma função?

P

Obrigado por responder kaoe. Esta funcao e pra retornar a quantidade de funcionarios que tem no registro. Em relacao ao ManagerFactory estou criando ele pq não estou conseguindo
criar a injelção via anotação, quando tento usar a anotacao o objeto retorna null.
Vai abaixo o código que tentei com a anotação e meu web.xml:

@PersistenceUnit(unitName="cffpersistence")
                 EntityManagerFactory emFactory;	

                @GET
	@Produces(MediaType.APPLICATION_JSON)
	@Path("/getFuncionarioCount")
	public Long getFuncionarioCount(){
		System.setProperty(Context.PROVIDER_URL, "C:\\Sistemas\\Temp");
		File f = new File(".\\teste.xml");
		
		try{
			if(f.createNewFile()==false){
				return -1L;
			}
		}catch(Exception ex){
			return -2L;
		}
		EntityManager em = emFactory.createEntityManager();
		Long size = (Long) em.createQuery("select COUNT(f.funSeq) from EcfFuncionarioEntity as f").getSingleResult();
		em.close();
		return size;
	}

web.xml

<?xml version="1.0"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
                         "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
 <display-name>compu.ws.server</display-name>
 <servlet>
  <servlet-name>Jersey REST Service</servlet-name>
  <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
  <init-param>
   <param-name>com.sun.jersey.config.property.packages</param-name>
   <param-value>compu.ws.service</param-value>
  </init-param>
  <init-param>
  	<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
  	<param-value>true</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
  <servlet-name>Jersey REST Service</servlet-name>
  <url-pattern>/rest/*</url-pattern>
 </servlet-mapping>
</web-app>

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- Persistence deployment descriptor for dev profile -->
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
             version="1.0">

    <persistence-unit name="cffpersistence">
    	<class>compu.ws.persistence.EcfFuncionarioEntity</class>
    	<class>compu.ws.persistence.EcfEmpresaEntity</class>
        <properties>

            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/>
            <property name="hibernate.connection.driver_class" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
            <property name="hibernate.connection.username" value="sa"/>
            <property name="hibernate.connection.password" value="compuforte"/>
            <property name="hibernate.connection.url" value="jdbc:sqlserver://localhost:1490"/>

            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>

            <property name="hibernate.search.default.indexBase" value="target"/>

            <!-- optional -->
            <property name="hibernate.default_schema" value="dbo"/>
            <property name="hibernate.default_catalog" value="compuecf"/>
        </properties>
    </persistence-unit>
</persistence>

Desde já agradeço.

kaoe

A injeção vai te intregar EntityManager e não EntityManagerFactory

P

Vlw pela resposta, mas nao rolou nao. Da uma olhada no meu codigo:

@PersistenceUnit(unitName="cffpersistence")
	EntityManager em;
	
	@GET
	@Produces(MediaType.APPLICATION_JSON)
	@Path("/getFuncionarioCount")
	public Long getFuncionarioCount(){
		System.setProperty(Context.PROVIDER_URL, "C:\\Sistemas\\Temp");
		File f = new File(".\\teste.xml");
		
		try{
			if(f.createNewFile()==false){
				return -1L;
			}
		}catch(Exception ex){
			return -2L;
		}
		//EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("cffpersistence");
		//EntityManager em = emFactory.createEntityManager();
		Long size = (Long) em.createQuery("select COUNT(f.funSeq) from EcfFuncionarioEntity as f").getSingleResult();
		em.close();
		return size;
	}
Criado 29 de maio de 2012
Ultima resposta 29 de mai. de 2012
Respostas 4
Participantes 2