A partir do momento que você comentou o “connection.datasource” você perdeu o pool de conexões. O Pool ocorre quando o container te oferece as conexões (através de Datasource).
No caso do JPA, para você “liberar” uma conexão, ou seja, enviar ela novamente para o servidor, você deve fechar o EntityMananger em.close(). Porém se você estiver em um ambiente JEE, ai o próprio container faz isso para você.
vou ter que estudar mesmo, pq nao entendi nada quando voce falou isso
e no caso como eu sei que estou usando jndi. há alguma maneira de monitorar por exemplo quantas conexoes estao livres, coisa desse tipo.
pq eu coloquei estas configuracoes no context.xml do tomcat, no meu persistence.xml, mas eu mesmo nao notei nada de diferenca!!!
Por isso não sei se configurei corretamente.
Tenho ainda 2 duvidas,
1- Estas condgiracoes são sufucientes para a configuração?
2 - Como eu sei que estou usando jndi
3- O significado desta linha
Se você está buscando a conexão do datasource ou não em um ambiente de desenvolvimento (onde só você está usando o sistema), você realmente não vai sentir diferença. A diferença será nitida em um ambiente de produção, quando várias pessoas estiverem usando o sistema simultâneamente.
Você consegue ver quantas conexões estão abertas no BANCO DE DADOS (isso varia de banco para banco).
Você conhece JTA? Se não, dê uma pesquisada nele, pois ai você vai entender o non-jta-data-source e jta-data-source , mas só adiantando, isso ai quer dizer que vai usar o datasource (vindo do tomcat), porém ele não vai gerenciar as transações através do JTA.
Entendi. Se eu colocar aquela linha o tomcat que ira controlar minhas transacoes.
Mas quando eu a coloco da exception isso quer dizer que nao estou usando jndi?
[quote=Vanderbill]Entendi. Se eu colocar aquela linha o tomcat que ira controlar minhas transacoes.
[/quote]
Não, pois você está setando “”, ou seja, NON. Se fosse jta-data-source a coisa seria diferente.
Quando você controla a transação, você de fato precisa usar o em.getTransaction().begin() e commit(), porém quando você deixa isso a cargo do servidor, você pode omitir essas linhas (aconselho estudar um pouco mais sobre transações, unit of work, e etc).
O assunto é bastante amplo, portanto aconselho você a estudar a parte de transação do JPA completa (JTA e RESOURCE_LOCAL). Certamente as coisas irão ficar mais claras para você.
devo colocar nonJta, e no caso ainda terei que mudar o transaction type de Resource_local para JTA.
Como no meu context eu defini as propriedades do banco essas coisas nao precisarei colocar isto no persistence.xml e devera funcionar.
Correto???
vlws pelas resposta, to lendo o doc do hibernate mas parece meio vago
Quando você vai usar a conexão vinda do DataSource, no seu persistence.xml você NÃO PRECISA COLOCAR USUÁRIO/SENHA, HOST, ETC ETC ETC. Os dados da conexão já vai vir pronta do DataSource, e consequentemente, haverá o pool de conexão.
Se eu configurar o context do tomcat com meus resources, nao precisarei definir nada de usuario essas coisas no persistence xml e tera que funcionar, pois assim terei ctza que estou usando o pool de conexoes.
Quando é meu web container que controla transacoes meu transaction type nao sera resource local e sim JTA, consequetemente nao precisarei
controlar transacoes e quando quiser persistir algo no banco usarei somente.
em.persist(myBean);
isso que eu entendi até agora. Agradeço muito sua paciencia e por compartilhar o seu conhecimento. Muito obrigado mesmo!!!
Agora tem um detalhe que eu não posso te dar 100% de certeza (isso você vai ter que pesquisar sozinho), é se o Tomcat consegue controlar as transações usando JTA. Pelo que eu saiba, isso só é feito em um container J2EE/JEE full (como JBOss, Glassfish, Websphere, etc). O que eu sei é que você pode usar o Spring + JTA + Tomcat para fazer o controle de transação, mas o Tomcat + JTA sozinho eu acho que não rola.
Repare que estou falando a nível de transação e não a nível de JNDI DataSource (que isso funciona 100% no tomcat).
entendi jr, realmente acho que eu mesmo vou controlar minhas transacoes por enquanto.
Mas eu quero fazer pool de conexoes
ou seja vou configurar os resources no tomcat e tirar as configuracoes no persitence.xml e colocar o nonjta pois eu que vou fazer controle das transacoes.
mas é necessario o uso dessa propriedade??
Bom, não sei se é o lugar certo pra perguntar pq eu não estou usando JPA, mas vamos lá, to recebendo o seguinte erro quando tento subir a aplicação que to fazendo e não sei mais como arrumar isso, ja pesquisei bastante e ao meu ver parece estar tudo certinho
O erro:
Caused by: org.hibernate.HibernateException: Could not find datasource: java:comp/env/jdbc/ORACLE
at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:82)
at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:137)
at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:79)
at org.hibernate.cfg.SettingsFactory.createConnectionProvider(SettingsFactory.java:448)
Estou usando Hibernate e vi em alguns artigos que se eu não quiser deixar o mesmo dataSource no TomCat pra várias aplicações tenho que colocar apenas o driver do oracle no diretório lib do tomCat (ja fiz isso)
Abaixo segue o que coloquei no meu web.xml:
E ai Vanderbill, vi seu post e to precisando de um help, estou desenvolvendo um aplicacao tbm com Spring + Hibernate + JPA. O problema é que preciso pegar o DataSource por JNDI, o dataSource ja esta configurado no Tomcat ja testei em outra aplicacao q pego o dataSource pelo spring.
Mas na aplicacao atual nao funciona, ele nao reconhece a configura do persistence.xml
java.lang.UnsupportedOperationException: The user must supply a JDBC connection
at org.hibernate.connection.UserSuppliedConnectionProvider.getConnection(UserSuppliedConnectionProvider.java:30)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:119)
at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:57)
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1326)
at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:38)
at org.springframework.orm.jpa.DefaultJpaDialect.beginTransaction(DefaultJpaDialect.java:70)
at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:330)
Oct 7, 2009 5:58:20 PM com.sun.jersey.server.impl.application.WebApplicationImpl mapMappableContainerException
SEVERE: The exception contained within MappableContainerException could not be mapped to a response, re-throwing to the HTTP container
java.lang.NoClassDefFoundError: com/sun/appserv/jdbc/DataSource
at com.citespace.citespacews.MyResource.getIt(MyResource.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:156)
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:67)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:208)
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:75)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:115)
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:67)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:736)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:701)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:692)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:339)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:452)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:633)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.ClassNotFoundException: com.sun.appserv.jdbc.DataSource
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1360)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1206)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 30 more
Oct 7, 2009 5:58:20 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet Jersey Web Application threw exception
java.lang.ClassNotFoundException: com.sun.appserv.jdbc.DataSource