[Resolvido] VRaptor com Hibernate - Estourando o limite do ConnectionPool

49 respostas
Rafael_Guerreiro

Bom dia.

Eu criei uma tela nova na aplicação, porém, esta tela em específico aparentemente não fecha as conexões com o banco.

Não sei se é uma prática ruim, mas eu uso um converter que vai receber o ID da entidade e carregar ela direto no controller. (Não uso o @Load pois ela pode ser nula)

@Convert(SellerGroup.class)
public class SellerGroupConverter implements Converter<SellerGroup> {

	private final Logger logger = LoggerFactory.getLogger(this.getClass());
	private final SellerGroupDAO sellerGroupDAO;

	public SellerGroupConverter(SellerGroupDAO sellerGroupDAO) {
		this.sellerGroupDAO = sellerGroupDAO;
	}

	@Override
	public SellerGroup convert(String value, Class<? extends SellerGroup> type,
			ResourceBundle bundle) {
		try {
			return sellerGroupDAO.get(Long.parseLong(value));
		} catch (NumberFormatException e) {
			logger.error("Cannot convert '" + value + "' to java.lang.Long.", e);
			throw e;
		}
	}
}

No meu controller eu simplesmente recebo esse objeto e o devolvo à tela (com mais alguns parâmetros…)

@Get("/seller/group/detail")
	public void detalhe(SellerGroup obj, boolean returnToInitial,
			boolean returnToList, Long coordenadorId) {
		// faz as coisas.
	}

Esse método deve carregar a detalhe.jsp…
Mas eu vi no log que o VRaptor está indo para a detalhe.json.jsp

17/05/12 10:27 DEBUG br.com.caelum.vraptor.view.DefaultPageResult:66
forwarding to /WEB-INF/jsp/sellerGroup/detalhe.json.jsp

Eu habilitei também o Hibernate Statistics

17/05/12 10:27 DEBUG frontend.rsedw.provider.SessionProvider:22
Openning session.
17/05/12 10:27 DEBUG org.hibernate.internal.SessionImpl:253
Opened session at timestamp: [telefone removido]
17/05/12 10:27 DEBUG frontend.rsedw.provider.SessionProvider:24
connectionCount: 22
17/05/12 10:27 DEBUG frontend.rsedw.provider.SessionProvider:26
sessionOpenCount: 26
17/05/12 10:27 DEBUG frontend.rsedw.provider.SessionProvider:29
sessionCloseCount: 16
17/05/12 10:27 DEBUG frontend.rsedw.provider.SessionProvider:36
Getting session.

Acontece o seguinte: chega uma hora que o sistema trava simplesmente por que ele não está fechando as conexões… E é só nessa tela de detalhe…

17/05/12 10:27 DEBUG org.hibernate.engine.jdbc.internal.LogicalConnectionImpl:295
Obtaining JDBC connection
17/05/12 10:27 DEBUG com.mchange.v2.resourcepool.BasicResourcePool:554
acquire test -- pool is already maxed out. [managed: 10; max: 10]
17/05/12 10:27 DEBUG com.mchange.v2.resourcepool.BasicResourcePool:1291
awaitAvailable(): com.mchange.v2.c3p0.impl.NewPooledConnection@19b6225
17/05/12 10:27 DEBUG com.mchange.v2.resourcepool.BasicResourcePool:1644
trace com.mchange.v2.resourcepool.BasicResourcePool@98a8b8 [managed: 10, unused: 0, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@19b6225)

O único lugar que eu abro a session é no SessionProvider (inclusive fiz uma busca por um openSession e só encontrou lá mesmo.)

Minha dúvida é: será que eu estou passando algum parâmetro errado para o VRaptor e este está interpretando a minha action como um JSON e por isso não está executando o @PreDestroy da classe SessionProvider? :?

Outra dúvida que eu sempre tive mas sempre esquecia de perguntar: por que eu não posso redirecionar para um @Post usando o result.redirectTo?

49 Respostas

Rafael_Guerreiro

Consegui “resolver” esse problema. Mas de uma forma tão feia, mas tão feia que eu fico até com vergonha de compartilhar.

Seguinte, no fim do método eu coloquei um:

} finally {
			// TODO - Verificar essa solução não homologada - GAMBIARRA
			if (session != null)
				session.close();
		}

Ou seja, eu recebi a Session no meu controller e no final desse método eu fecho ela implicitamente.

Lucas_Cavalcanti

quem tá abrindo a session?

Rafael_Guerreiro

Só a minha classe SessionProvider:

@RequestScoped
@Component
public class SessionProvider implements ComponentFactory<Session> {

	private final Logger logger = LoggerFactory.getLogger(this.getClass());
	private Session session;

	public SessionProvider(SessionFactory sessionFactory) {
		logger.debug("Openning session.");
		this.session = sessionFactory.openSession();
	}

	@Override
	public Session getInstance() {
		logger.debug("Getting session.");
		return session;
	}

	@PreDestroy
	public void destroy() {
		logger.debug("Closing session.");
		if (session != null && session.isOpen()) {
			session.close();
			logger.debug("Session closed.");
		}
	}
}

E no SellerGroupDAO eu recebo a session no construtor, normalmente.

Lucas_Cavalcanti

e ele tá sempre conseguindo fechar a sessão nesse código? ou vc tá tendo que fechar em outros lugares tb?

Rafael_Guerreiro

Então, somente nesse caso que ele executa de vez em quando, a cada 3 requisições, ele fecha 1. Uma hora estoura o limite.

Então a gambiarra que eu implementei foi o de fechar a session implicitamente no final da minha action… Fora o SessionProvider, lá é o único lugar que eu fecho a session.

Lucas_Cavalcanti

mas aparece o “closing session” no log sempre?

digo, tem o mesmo número de “Opening session” e “closing session”?

vc tá usando spring, guice ou pico?

Rafael_Guerreiro

Não. Para cada 3 Openning Session aparece 1 Closing Session. Ele nem chega a executar o destroy.

Eu uso Guice. E o SessionProvider é @RequestScoped.

Lucas_Cavalcanti

vc tá com o pacote da sua aplicação registrado lá no packages do web.xml? se sim, tente tirar…

vc tá contando o opening mesmo né? pq o getting vai ser chamado varias vezes.

Rafael_Guerreiro

No meu web.xml eu só registro um listener para que o guice remova as variáveis quando a sessão expirar.

<?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>FrontEnd</display-name>
	<context-param>
		<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
		<param-value>frontend.rsedw.language.messages</param-value>
	</context-param>
	<context-param>
		<param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
		<param-value>pt</param-value>
	</context-param>
	<context-param>
		<param-name>br.com.caelum.vraptor.encoding</param-name>
		<param-value>UTF-8</param-value>
	</context-param>
	<!-- <error-page> <exception-type>java.lang.Exception</exception-type> <location>/erro.jsp</location> 
		</error-page> <error-page> <error-code>404</error-code> <location>/erro.jsp</location> 
		</error-page> -->
	<session-config>
		<session-timeout>15</session-timeout>
	</session-config>
	<listener>
		<listener-class>br.com.caelum.vraptor.ioc.guice.SessionScopeListener</listener-class>
	</listener>
	<filter>
		<filter-name>vraptor</filter-name>
		<filter-class>br.com.caelum.vraptor.VRaptor</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>vraptor</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>REQUEST</dispatcher>
	</filter-mapping>
</web-app>

Eu refiz o teste e contei: tive 35 Opening session, 24 Closing session e 196 Getting session. Isso no momento em que travou, e ele trava bem no método que abre uma session.

Lucas_Cavalcanti

vc tem algum outro componente com @PreDestroy?

aparece algum erro no console?

vc tá com o log do vraptor habilitado? aparece algo sobre a destruição desses componentes?

Rafael_Guerreiro

Eu tenho outros @PreDestroy em outras classes não nessa. E lá eles são @SessionScoped.

Eu habilitei o log do VRaptor denovo, nenhuma exception é lançada, ele simplesmente pula a parte em que ele deveria executar o @PreDestroy
É normal isso aqui acontecer? Digo, ele terminou o request uma porrada de vezes… E recebeu 2 seguidinhos…

18/05/12 09:01 DEBUG br.com.caelum.vraptor.VRaptor:82
VRaptor received a new request
18/05/12 09:01 DEBUG br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler:53
Invoking interceptor ResourceLookupInterceptor
18/05/12 09:01 DEBUG br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler:53
Invoking interceptor ResourceLookupInterceptor
18/05/12 09:01 DEBUG br.com.caelum.vraptor.http.DefaultResourceTranslator:51
trying to access /WEB-INF/jsp/sellerGroup/detalhe.json.jsp
18/05/12 09:01 DEBUG br.com.caelum.vraptor.http.DefaultResourceTranslator:51
trying to access /WEB-INF/jsp/sellerGroup/detalhe.json.jsp
18/05/12 09:01 DEBUG br.com.caelum.vraptor.VRaptor:96
VRaptor ended the request
18/05/12 09:01 DEBUG br.com.caelum.vraptor.VRaptor:96
VRaptor ended the request
18/05/12 09:01 DEBUG br.com.caelum.vraptor.VRaptor:96
VRaptor ended the request
18/05/12 09:01 DEBUG br.com.caelum.vraptor.VRaptor:96
VRaptor ended the request
18/05/12 09:01 DEBUG br.com.caelum.vraptor.VRaptor:82
VRaptor received a new request
18/05/12 09:01 DEBUG br.com.caelum.vraptor.VRaptor:82
VRaptor received a new request
Lucas_Cavalcanti

tem o mesmo número de “VRaptor received a new request” e “VRaptor ended the request” ??

Rafael_Guerreiro

Não, temos 90 new requests e 88 ended requests (isso por que ele trava em um dos requests, mas deveria ter 1 só de diferença, né?)

Lucas_Cavalcanti

só pra testar, tenta desabilitar o seu tratamento de session e de transação e usar o do vraptor (registrando o pacote do hibernate no web.xml)

Rafael_Guerreiro

Vixe, mas ai eu vou precisar mexer em muitos lugares (agora começo a perceber que fiz besteira).

Mas eu uso as exceptions que o hibernate me retorna para verificação.

Para chegar nessa tela, eu preciso acessar várias outras. Se eu registrasse o pacote do hibernate, ele daria problema quando fosse fechar a session 2 vezes.

Lucas_Cavalcanti

mas é só não fechar a session no seu código :wink:

pq vc vai mexer mto? vc tem transações controladas manualmente?

Rafael_Guerreiro

Sim, as transações são manuais.

Existe um pacote desse que cuida só da session?

Eu disse fechar a session 2 vezes aquela hora mas era sobre os commits das transactions que eu queria falar.

Lucas_Cavalcanti

não… mas vc pode fazer o seguinte…

desabilite o seu criador de session e sessionFactory e faça:

@Component
public class MeuSession extends SessionCreator {
   //construtor
}

@Component @ApplicationScoped
public class MeuSessionFactory extends SessionFactoryCreator {
 
}
Rafael_Guerreiro

Ok, nesse caso eu registro o MeuSession ou o SessionCreator mesmo?

Lucas_Cavalcanti

é pra deixar as classes do jeito que eu coloquei, sem corpo (só o construtor delegando)

e tirar o @Component das suas classes que fazem o mesmo.

Rafael_Guerreiro

Por usar a forma programática eu sobreescrevi todos os métodos do SessionFactoryCreator. o MeuSession ficou só com o construtor mesmo.
A conexão e validação do banco foram feitas com sucesso…
Mas ao rodar a aplicação, eu tive essa exception aqui (eu devo sobreescrever os métodos de SessionCreator?):

1) Error notifying InjectionListener br.com.caelum.vraptor.ioc.guice.ScopeLifecycleListener$LifecycleExecutor@c1b161 of frontend.rsedw.provider.MeuSession.
 Reason: net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method create
  at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)
  while locating frontend.rsedw.provider.MeuSession
  while locating br.com.caelum.vraptor.ioc.ComponentFactory<org.hibernate.Session>
    for parameter 0 at br.com.caelum.vraptor.ioc.guice.ComponentFactoryProviderAdapter.<init>(ComponentFactoryProviderAdapter.java:35)
  while locating br.com.caelum.vraptor.ioc.guice.ComponentFactoryProviderAdapter<org.hibernate.Session>
  while locating org.hibernate.Session
    for parameter 0 at frontend.rsedw.dao.UsuarioDAO.<init>(UsuarioDAO.java:41)
  at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)
  while locating frontend.rsedw.dao.UsuarioDAO
    for parameter 3 at frontend.rsedw.controller.MainController.<init>(MainController.java:32)
  at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)
  while locating frontend.rsedw.controller.MainController
Lucas_Cavalcanti

tem alguma caused by?

Rafael_Guerreiro

Sim, é igual a Reason…

Reason: net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method create at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)

Lucas_Cavalcanti

e nenhum dos caused by é diferente?

Rafael_Guerreiro

Não, só dava esse caused by.

Agora esse problema acontece em vários outros lugares do sistema. Tenho quase certeza que são em todos que usam AJAX.
Será que não tem nada a ver com isso?

Lucas_Cavalcanti

esse "Could not invoke method create " acontece se deu alguma exception nesse método (daí deveria estar nos caused by) ou se esse método não está acessível (deveria estar nos caused by tb)

o que vc pode fazer é ao invés de usar o método create, execute o mesmo código no construtor.

Rafael_Guerreiro

Eu mexi um pouco naquele código. Ainda não chamei o create direto do construtor.
Mas agora ele fica num loop eterno tentando abrir a conexao.

GRAVE: Servlet.service() for servlet [default] in context with path [/FrontEnd] threw exception
com.google.inject.ProvisionException: Guice provision errors:

1) Error notifying InjectionListener br.com.caelum.vraptor.ioc.guice.ScopeLifecycleListener$LifecycleExecutor@1473a2e of frontend.rsedw.provider.SessionProvider.
 Reason: net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method create
  at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)
  while locating frontend.rsedw.provider.SessionProvider
  while locating br.com.caelum.vraptor.ioc.ComponentFactory<org.hibernate.Session>
    for parameter 0 at br.com.caelum.vraptor.ioc.guice.ComponentFactoryProviderAdapter.<init>(ComponentFactoryProviderAdapter.java:35)
  while locating br.com.caelum.vraptor.ioc.guice.ComponentFactoryProviderAdapter<org.hibernate.Session>
  while locating org.hibernate.Session
    for parameter 0 at frontend.rsedw.dao.RelCusSelAccDAO.<init>(RelCusSelAccDAO.java:34)
  at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)
  while locating frontend.rsedw.dao.RelCusSelAccDAO
    for parameter 2 at frontend.rsedw.controller.VisitaController.<init>(VisitaController.java:49)
  at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)
  while locating frontend.rsedw.controller.VisitaController
Caused by: net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method create
	at net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:45)
	at net.vidageek.mirror.invoke.MethodHandlerByMethod.withArgs(MethodHandlerByMethod.java:54)
	at net.vidageek.mirror.invoke.MethodHandlerByMethod.withoutArgs(MethodHandlerByMethod.java:58)
	at br.com.caelum.vraptor.ioc.guice.ScopeLifecycleListener$LifecycleExecutor.afterInjection(ScopeLifecycleListener.java:89)
	at com.google.inject.internal.MembersInjectorImpl.notifyListeners(MembersInjectorImpl.java:97)
	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:95)
	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
	at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1021)
	at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
	at br.com.caelum.vraptor.ioc.guice.AbstractScope$ScopedProvider.get(AbstractScope.java:52)
	at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
	at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:54)
	at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
	at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84)
	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
	at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:54)
	at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
	at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84)
	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
	at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1021)
	at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
	at br.com.caelum.vraptor.ioc.guice.AbstractScope$ScopedProvider.get(AbstractScope.java:52)
	at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
	at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
	at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84)
	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
	at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1021)
	at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
	at br.com.caelum.vraptor.ioc.guice.AbstractScope$ScopedProvider.get(AbstractScope.java:52)
	at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
	at com.google.inject.internal.InjectorImpl$4$1.call(InjectorImpl.java:968)
	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1014)
	at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:964)
	at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1003)
	at br.com.caelum.vraptor.ioc.guice.GuiceProvider$GuiceContainer.instanceFor(GuiceProvider.java:60)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.guice.GuiceProvider.provideForRequest(GuiceProvider.java:76)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	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:300)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;
	at br.com.caelum.vraptor.util.hibernate.SessionCreator.create(SessionCreator.java:47)
	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 net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:38)
	... 69 more
Rafael_Guerreiro

Chamando o método create pelo construtor, eu recebo outro monte de exceptions iguais em loop.
(Vai acabar que uma hora eu vou precisar sobreescrever todos os métodos do SessionCreator)

GRAVE: Servlet.service() for servlet [default] in context with path [/FrontEnd] threw exception
com.google.inject.ProvisionException: Guice provision errors:

1) Error injecting constructor, java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;
  at frontend.rsedw.provider.SessionProvider.<init>(SessionProvider.java:23)
  at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)
  while locating frontend.rsedw.provider.SessionProvider
  while locating br.com.caelum.vraptor.ioc.ComponentFactory<org.hibernate.Session>
    for parameter 0 at br.com.caelum.vraptor.ioc.guice.ComponentFactoryProviderAdapter.<init>(ComponentFactoryProviderAdapter.java:35)
  while locating br.com.caelum.vraptor.ioc.guice.ComponentFactoryProviderAdapter<org.hibernate.Session>
  while locating org.hibernate.Session
    for parameter 0 at frontend.rsedw.dao.UsuarioDAO.<init>(UsuarioDAO.java:41)
  at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)
  while locating frontend.rsedw.dao.UsuarioDAO
    for parameter 3 at frontend.rsedw.controller.MainController.<init>(MainController.java:32)
  at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:110)
  while locating frontend.rsedw.controller.MainController
Caused by: java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;
	at br.com.caelum.vraptor.util.hibernate.SessionCreator.create(SessionCreator.java:47)
	at frontend.rsedw.provider.SessionProvider.<init>(SessionProvider.java:24)
	at frontend.rsedw.provider.SessionProvider$$FastClassByGuice$$9ecabc1d.newInstance(<generated>)
	at com.google.inject.internal.cglib.reflect.$FastConstructor.newInstance(FastConstructor.java:40)
	at com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:60)
	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:85)
	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
	at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1021)
	at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
	at br.com.caelum.vraptor.ioc.guice.AbstractScope$ScopedProvider.get(AbstractScope.java:52)
	at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
	at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:54)
	at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
	at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84)
	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
	at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:54)
	at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
	at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84)
	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
	at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1021)
	at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
	at br.com.caelum.vraptor.ioc.guice.AbstractScope$ScopedProvider.get(AbstractScope.java:52)
	at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
	at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
	at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
	at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84)
	at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
	at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1021)
	at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
	at br.com.caelum.vraptor.ioc.guice.AbstractScope$ScopedProvider.get(AbstractScope.java:52)
	at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
	at com.google.inject.internal.InjectorImpl$4$1.call(InjectorImpl.java:968)
	at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1014)
	at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:964)
	at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1003)
	at br.com.caelum.vraptor.ioc.guice.GuiceProvider$GuiceContainer.instanceFor(GuiceProvider.java:60)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.guice.GuiceProvider.provideForRequest(GuiceProvider.java:76)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	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:300)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Lucas_Cavalcanti
Caused by: java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;

taí o erro… vc tá usando Hibernate 4 neh?
mas vc ainda tá com o jar do hibernate 3 no classpath…

tire o jar do hibernate 3 e adapte o código pro código novo…
ou use o plugin do vraptor pra hibernate 4.

Rafael_Guerreiro

Estou usando Hibernate 4, mas não tem nada do Hibernate 3.

Só estou com 1 core que é 4.1.1
o c3p0 4.1.1
annotations 4.0.1

Lucas_Cavalcanti

pra ele estar deixando compilar um método que não existe, vc tem que estar com duas versões do cara no classpath.

vc tá fazendo o deploy em algum servidor de aplicação (tipo o jboss)?
se sim, ele já vem com um hibernate, então vc não pode colocar um na sua aplicação.

Rafael_Guerreiro

Eu faço deploy no tomcat 7…

Eu tenho 2 jars do JBOSS : jboss-logging-3.1.0.GA.jar e jboss-transaction-api_1.1_spec-1.0.0.Final.jar

Lucas_Cavalcanti

Dá um Ctrl+Shift+T no eclipse em org.hibernate.Session

e veja quais são os jars que têm essa classe… vê se aparece algum do hibernate 3

Rafael_Guerreiro

Só tem 1 org.hibernate.Session e é do jar do Hibernate 4.1.1…

E só Session, tem 3, 1 do javax.mail outro do catalina (tomcat) e outro do hibernate…

Rafael_Guerreiro

E se eu fechar a sessão implicitamente em um interceptor?

Lucas_Cavalcanti

o que vc quer dizer com fechar implicitamente?

fecha com um método @PreDestroy no SessionCreator mesmo.

Rafael_Guerreiro

Mas, aparentemente, ele não está sendo executado.

Fechar implicitamente seria eu receber a session no construtor do interceptor e fechar ela, se não estiver fechada.

Lucas_Cavalcanti

bem estranho não estar fechando as sessões…

ninguém reclamou disso até hoje… bem bizarro o vraptor não estar chamando…

vc chegou a colocar um log no construtor e um no pre-destroy e ver se o número de logs bate?

Rafael_Guerreiro

Então, é a primeira vez que eu estou tendo esse problema…

Também é a primeira vez que eu estou usando bastante ajax…
(Deu para perceber que eu estou encucado achando que esse fato tem alguma relação com o AJAX)

Eu fiz log sim… Aquele “Opening Session”, “Closing session.” e “Getting session”

Lucas_Cavalcanti

Não lembro se vc já fez esse teste, mas funciona se vc trocar o guice pelo spring?

Rafael_Guerreiro

Não fiz esse teste, mas em questão de performance das requisições, o guice é mais rápido, não?

Lucas_Cavalcanti

sim… mas eu quero ver se é um bug do lado do vraptor…

o spring gerencia o pre-destroy, no guice a gente tá fazendo isso na mão do lado do vraptor.

Rafael_Guerreiro

Uma boa E duas más notícias…

A boa: Com spring ele está fechando todas as sessions… (Tive 64 Opening session e 64 Closing session. Inclusive, tive o mesmo número de requests feitas e requests finalizadas do VRaptor… To achando que é bug no Guice…)

As más:

  1. É bem provável que tenha um bug nessa parte do VRaptor (Ou guice) (mas é estranho isso porque é a primeira vez que eu tenho esse problema)

  2. Como nesse tópico que eu mesmo postei algum tempo atrás:
    http://www.guj.com.br/java/273848-nullpointerexception-estranha-do-guice
    Com o Spring eu estou tendo uma outra exception no lugar dessa:

25/05/2012 14:47:46 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-80"]
25/05/2012 14:47:46 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
25/05/2012 14:47:46 org.apache.catalina.startup.Catalina start
INFO: Server startup in 4506 ms
25/05/2012 14:47:53 org.apache.catalina.session.StandardSession tellNew
GRAVE: Session event listener threw exception
java.lang.NoClassDefFoundError: com/google/inject/Module
	at br.com.caelum.vraptor.ioc.guice.SessionScopeListener.sessionCreated(SessionScopeListener.java:16)
	at org.apache.catalina.session.StandardSession.tellNew(StandardSession.java:425)
	at org.apache.catalina.session.StandardSession.setId(StandardSession.java:396)
	at org.apache.catalina.session.StandardSession.setId(StandardSession.java:377)
	at org.apache.catalina.session.ManagerBase.createSession(ManagerBase.java:653)
	at org.apache.catalina.connector.Request.doGetSession(Request.java:2766)
	at org.apache.catalina.connector.Request.getSession(Request.java:2264)
	at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:899)
	at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:911)
	at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:238)
	at br.com.caelum.vraptor.ioc.spring.HttpSessionProvider.getObject(HttpSessionProvider.java:37)
	at br.com.caelum.vraptor.ioc.spring.HttpSessionProvider.getObject(HttpSessionProvider.java:33)
	at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)
	at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:109)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1429)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:245)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:844)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:786)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:795)
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:723)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:196)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:907)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	at org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:329)
	at org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:325)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:263)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1083)
	at br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:86)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	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:300)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.google.inject.Module
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1678)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1523)
	... 59 more
Lucas_Cavalcanti

Caused by: java.lang.ClassNotFoundException: com.google.inject.Module

vc tá com o jar do guice no classpath? o guice na versão certa?

Rafael_Guerreiro

Não estou com guice mais… Esse é que é o pior… Eu tirei ele e coloquei só os jars do spring…

Lucas_Cavalcanti

mas não funcionou? o spring não abriu e fechou as sessions?

Rafael_Guerreiro

Sim, funcionou, ai eu mantive o Spring (até por que as requisições tiveram só alguns milissegundos a mais… E por ser intranet, não faz tanta diferença assim)

Só que eu decidi manter o Spring (justamente por isso) mas acontece aquele exception doida lá… O sistema funciona perfeitamente, mas ela acontece quando inicia…

Lucas_Cavalcanti

br.com.caelum.vraptor.ioc.guice.SessionScopeListener

vc registrou esse listener, mas ele só é necessário qdo vc tá usando o guice.

Rafael_Guerreiro

Puts, é mesmo! :oops:

E assim a exception parou, o connection pool não estoura mais. está uma maravilha, muitíssimo obrigado!

Criado 17 de maio de 2012
Ultima resposta 27 de mai. de 2012
Respostas 49
Participantes 2