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

49 respostas
R

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

R

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.

L

quem tá abrindo a session?

R

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.

L

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

R

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.

L

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?

R

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.

L

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.

R

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.

L

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?

R

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
L

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

R

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é?)

L

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)

R

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.

L

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

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

R

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.

L

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 {
 
}
R

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

L

é 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.

R

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
L

tem alguma caused by?

R

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)

L

e nenhum dos caused by é diferente?

R

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?

L

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.

R

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
R

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)
L
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.

R

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

L

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.

R

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

L

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

R

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…

R

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

L

o que vc quer dizer com fechar implicitamente?

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

R

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.

L

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?

R

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”

L

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

R

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

L

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.

R

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
L

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

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

R

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

L

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

R

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…

L

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

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

R

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