Sobrecarga de Memoria, Configuração Pool Connection

9 respostas
tomcatjsfmysql
P

Olá a todos, estou com um problema na minha aplicação que ela anda sobrecarregando o meu Tomcat. Após algumas horas de utilização a minha aplicação trava, apresentando o erro de: Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded.
03-Feb-2020 23:58:54.021 WARNING [http-nio-8080-exec-20] com.sun.faces.lifecycle.InvokeApplicationPhase.execute #{loginAlunoController.login()}: javax.persistence.PersistenceException: [PersistenceUnit: testbedsPU] Unable to build Hibernate SessionFactory javax.faces.FacesException: #{loginAlunoController.login()}: javax.persistence.PersistenceException: [PersistenceUnit: testbedsPU] Unable to build Hibernate SessionFactory at com.sun.faces.application.ActionListenerImpl.getNavigationOutcome(ActionListenerImpl.java:120) at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:95) at javax.faces.component.UICommand.broadcast(UICommand.java:246) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:871) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1419) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:201) at javax.faces.webapp.FacesServlet.executeLifecyle(FacesServlet.java:731) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:475) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.ocpsoft.rewrite.servlet.RewriteFilter.doFilter(RewriteFilter.java:226) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source) Caused by: javax.faces.el.EvaluationException: javax.persistence.PersistenceException: [PersistenceUnit: testbedsPU] Unable to build Hibernate SessionFactory at com.sun.faces.application.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:100) at com.sun.faces.application.ActionListenerImpl.getNavigationOutcome(ActionListenerImpl.java:106) ... 34 more Caused by: javax.persistence.PersistenceException: [PersistenceUnit: testbedsPU] Unable to build Hibernate SessionFactory at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1012) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:938) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) at br.com.projeto.testbeds.util.EntityManagerProducer.<init>(EntityManagerProducer.java:14) at sun.reflect.GeneratedConstructorAccessor262.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:119) at org.jboss.weld.injection.ConstructorInjectionPoint.invokeAroundConstructCallbacks(ConstructorInjectionPoint.java:92) at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:78) at org.jboss.weld.injection.producer.AbstractInstantiator.newInstance(AbstractInstantiator.java:28) at org.jboss.weld.injection.producer.BasicInjectionTarget.produce(BasicInjectionTarget.java:112) at org.jboss.weld.injection.producer.BeanInjectionTarget.produce(BeanInjectionTarget.java:186) at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:158) at org.jboss.weld.context.unbound.DependentContextImpl.get(DependentContextImpl.java:70) at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.get(ContextualInstanceStrategy.java:100) at org.jboss.weld.bean.ContextualInstance.get(ContextualInstance.java:50) at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:785) at org.jboss.weld.injection.producer.AbstractMemberProducer.getReceiver(AbstractMemberProducer.java:123) at org.jboss.weld.injection.producer.AbstractMemberProducer.produce(AbstractMemberProducer.java:158) at org.jboss.weld.bean.AbstractProducerBean.create(AbstractProducerBean.java:180) at org.jboss.weld.context.AbstractContext.get(AbstractContext.java:96) at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.get(ContextualInstanceStrategy.java:100) at org.jboss.weld.bean.ContextualInstanceStrategy$CachingContextualInstanceStrategy.get(ContextualInstanceStrategy.java:177) at org.jboss.weld.bean.ContextualInstance.get(ContextualInstance.java:50) at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:99) at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:99) at org.jboss.weldx.persistence.EntityManager$444626625$Proxy$_$$_WeldClientProxy.getTransaction(Unknown Source) at br.com.projeto.testbeds.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:23) at sun.reflect.GeneratedMethodAccessor594.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.jboss.weld.interceptor.reader.SimpleInterceptorInvocation$SimpleMethodInvocation.invoke(SimpleInterceptorInvocation.java:73) at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeAroundInvoke(InterceptorMethodHandler.java:85) at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeInterception(InterceptorMethodHandler.java:73) at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:57) at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:79) at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:68) at br.com.projeto.testbeds.controller.LoginAlunoController$Proxy$_$$_WeldSubclass.login(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.el.parser.AstValue.invoke(AstValue.java:247) at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267) at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40) at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50) at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:89) at com.sun.faces.application.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:90) ... 35 more Caused by: org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:123) at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77) at org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelImpl.java:181) at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:305) at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:462) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:935) ... 84 more Caused by: org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer] at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:91) at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:116) at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:413) at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:571) at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:124) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96) ... 89 more Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:88) ... 98 more Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded

A diferença que percebi que o Hikari que estou utilizando para controle de Pool está mantendo threads em Running mesmo após a consulta no banco, mesmo após a Session tenha sido encerrada. Creio que isso está sobrecarregando minha aplicação.

Estou utilizando JSF, MySQL, Hibernate, Hikari:
`
pom:

4.0.0
br.com.projeto
testbeds
war
0.0.1-SNAPSHOT
testbeds

<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<!-- https://mvnrepository.com/artifact/org.omnifaces/omnifaces -->
		<dependency>
			<groupId>org.omnifaces</groupId>
			<artifactId>omnifaces</artifactId>
			<version>3.3</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.primefaces/primefaces -->
		<dependency>
			<groupId>org.primefaces</groupId>
			<artifactId>primefaces</artifactId>
			<version>7.0</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.jboss.weld.servlet/weld-servlet -->
		<dependency>
			<groupId>org.jboss.weld.servlet</groupId>
			<artifactId>weld-servlet</artifactId>
			<version>2.4.8.Final</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.jboss/jandex -->
		<dependency>
			<groupId>org.jboss</groupId>
			<artifactId>jandex</artifactId>
			<version>2.1.1.Final</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>5.4.6.Final</version>
		</dependency>


		<!--  https://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0 
			<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-c3p0</artifactId> 
			<version>5.4.9.Final</version> </dependency> -->

		<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
		<dependency>
			<groupId>com.mchange</groupId>
			<artifactId>c3p0</artifactId>
			<version>0.9.5.4</version>
		</dependency>


		<!-- https://mvnrepository.com/artifact/org.hibernate.common/hibernate-commons-annotations -->
		<dependency>
			<groupId>org.hibernate.common</groupId>
			<artifactId>hibernate-commons-annotations</artifactId>
			<version>5.1.0.Final</version>
		</dependency>



		<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<version>5.4.6.Final</version>
		</dependency>


		<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.16</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.glassfish/javax.faces -->
		<dependency>
			<groupId>org.glassfish</groupId>
			<artifactId>javax.faces</artifactId>
			<version>2.4.0</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>4.0.1</version>
			<scope>provided</scope>
		</dependency>

		<!-- https://mvnrepository.com/artifact/com.sun.faces/jsf-api -->
		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-api</artifactId>
			<version>2.2.13</version>
		</dependency>


		<!-- https://mvnrepository.com/artifact/javax/javaee-api -->
		<dependency>
			<groupId>javax</groupId>
			<artifactId>javaee-api</artifactId>
			<version>7.0</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>net.bootsfaces</groupId>
			<artifactId>bootsfaces</artifactId>
			<version>1.4.1</version>
			<scope>compile</scope>
		</dependency>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.json/json -->
		<dependency>
			<groupId>org.json</groupId>
			<artifactId>json</artifactId>
			<version>20180813</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
		<dependency>
			<groupId>org.hibernate.validator</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>6.1.0.Alpha5</version>
		</dependency>

		<dependency>
			<groupId>org.ocpsoft.rewrite</groupId>
			<artifactId>rewrite-servlet</artifactId>
			<version>3.4.1.Final</version>
		</dependency>
		<dependency>
			<groupId>org.ocpsoft.rewrite</groupId>
			<artifactId>rewrite-config-prettyfaces</artifactId>
			<version>3.4.1.Final</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>4.1.0</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/net.sourceforge.barbecue/barbecue -->
		<dependency>
			<groupId>net.sourceforge.barbecue</groupId>
			<artifactId>barbecue</artifactId>
			<version>1.5-beta1</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports -->
		<dependency>
			<groupId>net.sf.jasperreports</groupId>
			<artifactId>jasperreports</artifactId>
			<version>6.9.0</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports-fonts -->
		<dependency>
			<groupId>net.sf.jasperreports</groupId>
			<artifactId>jasperreports-fonts</artifactId>
			<version>6.9.0</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/xerces/xercesImpl -->
		<dependency>
			<groupId>xerces</groupId>
			<artifactId>xercesImpl</artifactId>
			<version>2.12.0</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
		<!-- slf4j-log4j -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.6.1</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.hsqldb/hsqldb -->
		<dependency>
			<groupId>org.hsqldb</groupId>
			<artifactId>hsqldb</artifactId>
			<version>2.5.0</version>
			<scope>test</scope>
		</dependency>

		<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.4</version>
		</dependency>

		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.6</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/joda-time/joda-time -->
		<dependency>
			<groupId>joda-time</groupId>
			<artifactId>joda-time</artifactId>
			<version>2.10.4</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/commons-validator/commons-validator -->
		<dependency>
			<groupId>commons-validator</groupId>
			<artifactId>commons-validator</artifactId>
			<version>1.6</version>
		</dependency>

<!-- 
		<dependency>
			<groupId>com.zaxxer</groupId>
			<artifactId>HikariCP</artifactId>
			<version>3.4.2</version>
		</dependency>
		-->

		<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-hikaricp -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-hikaricp</artifactId>
			<version>5.4.10.Final</version>
		</dependency>


	</dependencies>

	<build>
		<finalName>testbeds</finalName>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.8.0</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

Meu Persistence:

<?xml version="1.0" encoding="UTF-8"?>



br.com.projeto.testbeds.persistence.entities.Curso
br.com.projeto.testbeds.persistence.entities.Edital
br.com.projeto.testbeds.persistence.entities.AlunoInscricao
br.com.projeto.testbeds.persistence.entities.Disciplina
br.com.projeto.testbeds.persistence.entities.Usuario
br.com.projeto.testbeds.persistence.entities.Projeto
br.com.projeto.testbeds.persistence.entities.ProjetoAluno
br.com.projeto.testbeds.persistence.entities.Campus
br.com.projeto.testbeds.persistence.entities.Mensagem
br.com.projeto.testbeds.persistence.entities.MensagemAnexo
br.com.projeto.testbeds.persistence.entities.Pendencia
br.com.projeto.testbeds.persistence.entities.AcaoUsuario
br.com.projeto.testbeds.persistence.entities.Emprego
br.com.projeto.testbeds.persistence.entities.Acesso

<properties>

		<!-- Hibernate Connection Settings -->
		<property name="hibernate.connection.provider_class"
			value="com.zaxxer.hikari.hibernate.HikariConnectionProvider" />
		<property name="hibernate.hikari.dataSourceClassName"
			value="com.mysql.cj.jdbc.MysqlDataSource" />
		<property name="hibernate.hikari.dataSource.url"
			value="jdbc:mysql://localhost:3306/testbeds" />
		<property name="hibernate.hikari.dataSource.user"
			value="root" />
		<property name="hibernate.hikari.dataSource.password"
			value="root" />
		<!--
		<property name="hibernate.hikari.dataSource.cachePrepStmts"
			value="true" />
		<property
			name="hibernate.hikari.dataSource.prepStmtCacheSize" value="250" />
		<property
			name="hibernate.hikari.dataSource.prepStmtCacheSqlLimit"
			value="2048" /> -->

		<property name="hibernate.hikari.minimumIdle" value="0" />
		<property name="hibernate.hikari.maximumPoolSize" value="4" />

		<property name="hibernate.hikari.idleTimeout" value="300" />
		<property name="hibernate.hikari.maxLifetime" value="500" />

		<property name="hibernate.hikari.connectionTimeout"
			value="500" />
		<property name="hibernate.hikari.validationTimeout"
			value="300" />


		<!-- SQL Settings -->
		<property name="hibernate.dialect"
			value="org.hibernate.dialect.MySQL5InnoDBDialect" />
		<property name="hibernate.show_sql" value="false" />
		<property name="hibernate.format_sql" value="false" />
		<property name="hibernate.use_sql_comments" value="false" />

		<property name="hibernate.connection.release_mode"
			value="ON_CLOSE" />


	</properties>

</persistence-unit>
` Classe EntityManagerProducer: ` import javax.enterprise.context.RequestScoped; import javax.enterprise.inject.Disposes; import javax.enterprise.inject.Produces; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence;

public class EntityManagerProducer {

private EntityManagerFactory factory;

public EntityManagerProducer() {
	this.factory = Persistence.createEntityManagerFactory("testbedsPU");
}

@Produces
@RequestScoped
public EntityManager createEntityManager() {
	System.out.println("criar1");
	return factory.createEntityManager();
	
}

public void closeEntityManager(@Disposes EntityManager manager) {
	manager.close();
	this.factory.close();
}

}

DAOFactory

import java.lang.reflect.ParameterizedType;

import javax.enterprise.context.Dependent;

import javax.enterprise.inject.Produces;

import javax.enterprise.inject.spi.InjectionPoint;

import javax.inject.Inject;

import javax.persistence.EntityManager;

import br.com.projeto.testbeds.persistence.DAOInterfaces.DAO;

public class DAOFactory {

@Inject
private EntityManager em;

@SuppressWarnings({ "rawtypes", "unchecked" })
@Produces
@Dependent
public <T> DAO<T> createDAO(InjectionPoint point) {
	ParameterizedType type = (ParameterizedType) point.getType();
	Class classe = (Class) type.getActualTypeArguments()[0];
	return new DAOImpl<T>(classe, em);
}

}

DaoImpl

import java.io.Serializable;

import java.util.ArrayList;

import java.util.List;

import java.util.regex.Matcher;

import java.util.regex.Pattern;
import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

import javax.persistence.Query;

import javax.persistence.TypedQuery;

import br.com.projeto.testbeds.persistence.DAOInterfaces.DAO;
import br.com.projeto.testbeds.persistence.fileservice.FileXMLService;

public class DAOImpl implements DAO {

/**
 * 
 */
private static final long serialVersionUID = 422152908443386672L;

private EntityManager em;

private final Class<T> classe;

private static final FileXMLService hqlQuery;

static {
	hqlQuery = new FileXMLService("hql.xml");
}

public DAOImpl(Class<T> classe, EntityManager em) {
	this.classe = classe;
	this.em = em;
}

@Override
public T save(T entity) {
	em.persist(entity);
	em.flush();
	return entity;
}

@Override
public T update(T entity) {
	entity = em.merge(entity);
	em.flush();
	return entity;
}

@Override
public List<T> getAll() {
	String hql = "Select e from " + this.classe.getSimpleName() + " e";
	TypedQuery<T> query = em.createQuery(hql, this.classe);
	return query.getResultList();
}

@Override
public List<T> findByHQLQuery(String queryId, int maxResults) {
	String hql = hqlQuery.findValue(queryId);
	TypedQuery<T> query = em.createQuery(hql, this.classe);
	return maxResults == 0 ? query.getResultList() : query.setMaxResults(maxResults).getResultList();

}

@Override
public List<T> findByHQLQuery(String queryId, List<Object> value, int maxResults) {
	String hql = hqlQuery.findValue(queryId);
	Pattern pattern = Pattern.compile("(:\\w+)");
	Matcher matcher = pattern.matcher(hql);
	List<String> params = new ArrayList<>();
	while (matcher.find()) {
		params.add(matcher.group().replace(":", ""));
	}
	// System.out.println();
	// System.out.print(hql);
	TypedQuery<T> query = em.createQuery(hql, this.classe);
	for (int i = 0; i < params.size(); i++) {
		// System.out.println(params.get(i) + " - " + value.get(i));
		query.setParameter(params.get(i), value.get(i));
	}
	// System.out.println();
	// System.out.println();
	
	return maxResults == 0 ? query.getResultList() : query.setMaxResults(maxResults).getResultList();
	//System.out.println("a13");
	// return null;
}

// para aqueles que gosta de anotar as querie na model
@Override
public List<T> findByHQLNamedQuery(String queryNamed, int maxResults) {
	String hql = queryNamed;
	TypedQuery<T> query = em.createNamedQuery(hql, this.classe);
	return maxResults == 0 ? query.getResultList() : query.setMaxResults(maxResults).getResultList();

}

@Override
public List<T> findByHQLNamedQuery(String queryNamed, List<Object> value, int maxResults) {
	String hql = queryNamed;
	Pattern pattern = Pattern.compile("(:\\w+)");
	Matcher matcher = pattern.matcher(hql);
	List<String> params = new ArrayList<>();
	while (matcher.find()) {
		params.add(matcher.group().replace(":", ""));
	}
	// System.out.println();
	// System.out.print(hql);
	TypedQuery<T> query = em.createNamedQuery(hql, this.classe);
	for (int i = 0; i < params.size(); i++) {
		// System.out.println(params.get(i) + " - " + value.get(i));
		query.setParameter(params.get(i), value.get(i));
	}
	// System.out.println();
	// System.out.println();		
	return maxResults == 0 ? query.getResultList() : query.setMaxResults(maxResults).getResultList();
	// return null;
}

@Override
public int updateHQLQuery(String queryId) {
	String hql = hqlQuery.findValue(queryId);
	// System.out.println(hql);
	Query query = em.createQuery(hql);
	int updateCount = query.executeUpdate();
	em.flush();
	return updateCount;
}

@Override
public int updateHQLQuery(String queryId, List<Object> value) {
	String hql = hqlQuery.findValue(queryId);
	Pattern pattern = Pattern.compile("(:\\w+)");
	Matcher matcher = pattern.matcher(hql);
	List<String> params = new ArrayList<>();
	while (matcher.find()) {
		params.add(matcher.group().replace(":", ""));
	}
	// System.out.print(hql);
	Query query = em.createQuery(hql);
	for (int i = 0; i < params.size(); i++) {
		query.setParameter(params.get(i), value.get(i));
	}
	int updateCount = query.executeUpdate();
	em.flush();
	return updateCount;
}

@Override
public void remove(T entity) {
	em.remove(em.contains(entity) ? entity : em.merge(entity));
	em.flush();
}

@Override
public T findById(Serializable id) {
	/*if (em == null)
		System.out.println("em is null");
	
	if (id == null)
		System.out.println("id is null");
	
	if (this.classe == null)
		System.out.println("classe is null");
	
	if (em.find(this.classe, id) == null)
		System.out.println(this.classe + " " + id);*/

	return em.find(this.classe, id);
}

@Override
public Query query(String hql) {
	return em.createQuery(hql);
}

@Override
public T refreshEntity(T entity) {
	if(entity == null) 
		System.out.println(entity);
	em.refresh(entity);
	return entity;
}

@SuppressWarnings("unchecked")
@Override
public List<T> execSQLNative(String SQL) {
	return em.createNativeQuery(SQL, this.classe).getResultList();
}

}
Exemplo da threads que ficam em modo running :


Agradeço quem puder ajudar.

9 Respostas

J

Usa JdbcTemplate que é bem mais leve.

P

Agradeço sua ajuda, mas eu gostaria de fazer está configuração com o banco de dados via aplicação, em caso de futuros projetos eu não precise alterar o meu serviço Tomcat com várias outras conexões, resources de conexão com o banco. Exemplo JSF e JDBC que encontrei: JSF + JDBC . E converter o projeto para Spring neste momento é inviável.

J

O impacto é o mesmo mudar pra JDBC puro ou JdbcTemplate (só pra se livrar do overhead do Hibernate, não seria pra usar nada além disso da Spring, de resto continua JSF, etc). A configuração também fica via aplicação, nada amarrado a tomcat. Sair do pesadelo do Hibernate não tem preço

P

Compreendi, se tiver algum exemplo para demonstrar ou algum link para pesquisa do JDBC ou JDBCTemplate, estou aberto a sugestões que me auxile na aplicação para melhorar ela ou futuras aplicações.

P

No atual momento consegui resolver o meu problema de threads soltas alterando meu EntityManagerFactory:

public class EntityManagerProducer {

 /** Antigo: private EntityManagerFactory factory;

public EntityManagerProducer() {
	this.factory = Persistence.createEntityManagerFactory("testbedsPU");
} **/

 //Novo
	private static EntityManagerFactory factory;
//Novo
	static {
		factory = Persistence.createEntityManagerFactory("testbedsPU");
	}

	@Produces
	@RequestScoped
	public EntityManager createEntityManager() {
		EntityManager e = factory.createEntityManager();
		return e;

	}

	public void closeEntityManager(@Disposes EntityManager manager) {
		manager.close();
	}
}

No momento ele cria uma estática EntityManagerFactory e mantem para toda aplicação, e fico criando apenas o EntityManager conforme requisição do DAO.

E

Realmente hibernate é um framework complexo. Tive que estuda-lo várias vezes, são tantos detalhes que acabo esquecendo alguma coisa.

O EntityFramework do .net é semelhante ao hibernate? Ou é muito mais fácil de trabalhar com ele?

Qual ORM é mais indicado no .net?

J

Embora mais leves, EntityFramework e EFCore seguem a mesma proposta do Hibernate/NHibernate, de ser um ORM completo. Ambos exigem estudos aprofundados pra não cair em armadilhas.

Não existe um mais indicado, pela minha experiência Dapper é o que usei de mais leve e sob controle.

E

Entendi.

Atualmente tenho a ideia de que é um absurdo ter que estudar um livro de mais de 500 páginas para começar a aprender persistir dados no banco.

Esses frameworks tipo hibernate parecem um pouco com JSF, tem que ser muito bem estudado e dominado para ser produtivo.

Às vezes o ganho de produtividade que temos o perdemos com dias paralisados diante de “erros” que são particularidades do Framework.

Me parece que a tendência é utilizar coisas mais leves e sem tanta abstração.

J

Sim, pra nuvem considerando alta escalabilidade isso é extremamente importante, além da curva de aprendizado ser bem menor.

Criado 4 de fevereiro de 2020
Ultima resposta 8 de fev. de 2020
Respostas 9
Participantes 3