1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Problema de excesso de consumo de memoria RAM em aplicacao do Spring com JPA

Quando estou desenvolvendo um projeto web em Java no Netbeans, clico com o botao direito no projeto e clico em executar. O Netbeans entao implanta o projeto, inicia o Tomcat, e o meu navegador padrao se abre mostrando a pagina inicial do meu projeto. Entao, eu simplesmente fecho o navegador e o processo se repete (Em nenhum momento eu paro o tomcat). Estou usando o Spring para gerenciar o JPA. Toda vez que eu executo o projeto, o tomcat mostra a mensagem: org.hibernate.jpa/internal.util.LogHelper.logPersistenceUnitInformation HHH000204: Processing PersistenceUnitINfo [ name: ProjetoPU], indicando que ele esta criando a Unidade de persistencia. O problema eh que a cada vez que eu executo o projeto, o tomcat vai comendo a memoria RAM, passando de 600 MB para 2 GB gradualmente, conforme eu vou executando o projeto. Eu acredito que seja por causa do Spring que vai criando Unidade de persistencia toda hora que eu clico em executar, sem apagar as antigas. E nos logs do tomcat, tambem aparecem a mensagem SEVERE The web application registered the JDBC Driver but failed to unregister it.... Eu acredito que alguma configuracao errada no JPA ou no Spring esta fazendo com que toda vez que eu abro o projeto, ele crie de novo a unidade de persistencia, o que come a memoria ram e faz com o programa nao consiga desregistrar o driver do JDBC. Estou certo neste meu pensamento ? Como eu resolvo o meu problema ?

--------------UPDATE-------------

Meu web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/frm_login.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

Meu applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc" 
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/mvc
 http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd 
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd">


<context:component-scan base-package="br.com.projeto"/>
<mvc:annotation-driven />
<bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/bd_projeto?zeroDateTimeBehavior=convertToNull"/> 
<property name="username" value="root"/> 
<property name="password" value=""/>
</bean>
<bean id="entityManagerFactory"
      class= "org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="mysqlDataSource" /> 
    <property name="jpaVendorAdapter"> 
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
    </property> 
</bean>
<bean id="transactionManager" 
      class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
        <property name="scopes">
            <map>
                <entry key="view">
                    <bean class="br.com.projeto.scope.ViewScope"/>
                </entry>
            </map>
        </property>
    </bean>
<bean id="loginDao" class="br.com.projeto.dao.LoginDaoImpl"/>
<bean id="login" class="br.com.projeto.modelo.Login">
    <property name="LoginDao" ref="loginDao"/>
</bean>
</beans>

Meu persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="ProjetoPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>br.com.projeto.modelo.Amizade</class>
    <class>br.com.projeto.modelo.Mensagem</class>
    <class>br.com.projeto.modelo.Usuario</class>
    <class>br.com.projeto.modelo.Post</class>
    <class>br.com.projeto.modelo.Login</class>
    <class>br.com.projeto.modelo.Comentario</class>
    <class>br.com.projeto.modelo.Aprovacao</class>
    <class>br.com.projeto.modelo.Tag</class>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/bd_projeto?zeroDateTimeBehavior=convertToNull"/>
      <property name="javax.persistence.jdbc.user" value="root"/>
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
      <property name="javax.persistence.jdbc.password" value=""/>
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.format_sql" value="true"/>
    </properties>
  </persistence-unit>
</persistence>

Meu faces-config.xml

<faces-config xmlns="http://java.sun.com/xml/ns/javaee" 
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" version="2.0">
    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    </application>
</faces-config>
  • Eu sugiro trocar o Spring por um ambiente Java-EE, como o Jboss usando um container EJB.

    Giovane   20 de mar de 2015
  • Poxa, mas mesmo sendo o Spring um framework tao completo, nao ha uma maneira de eu falar pra ele "Spring, crie a unidade de persistencia do Hibernate apenas uma vez, pois voce esta consumindo toda a Memoria RAM do meu pc !" Nao existe como eu configurar isto no Spring ? (Caso o problema seja mesmo nele)

    Kratos   20 de mar de 2015
  • Isso não tem nada a ver com o Framework mas sim com a forma que a IDE está subindo sua aplicação (isso se for mesmo o que você está pensando). Uma forma de descobrir se as execuções estão ficando penduradas é verificar se estão sendo criados vários processos java/javaw no seu gerenciador de aplicações. Outra forma simples, não mande executar sem antes parar a instância anterior do tomcat. Mesmo dito tudo isso ainda desconfio que não é isso. Mas tente.

    adriano_si   20 de mar de 2015
  • Dentro do gerenciador de tarefas, ha apenas um processo java.exe que fica consumindo a minha memoria ram. Nao sao criados outros processos. @adriano_si, qual eh o problema que voce desconfia ?

    Kratos   20 de mar de 2015
  • Acho que sua aplicação está crescendo com o tempo de forma natural. Faça um teste. Feche o NetBeans e abra de novo, execute sua aplicação somente 1 vez e a use por uns 30 minutos. Veja se ela ficou em 600 mb ou se ela consome mais da sua RAM. Isso pode ser N coisas, mas podemos ir fechando o cerco fazendo os testes.

    adriano_si   20 de mar de 2015
Mostrar todos os 12 comentários>
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags jpa spring hibernate memória tomcat netbeans web jdbc java ou faça a sua própria pergunta.