JPA + JNDI + Locaweb [RESOLVIDO]

Estava tendo problemas de acesso a minha aplicação hospedada na locaweb, uso JPA e Hibernate e a solução proposta por eles a esse problema foi usar um Datasource JNDI para pegar a conexão;

codigo do datasource no tomcat

<Resource name="jdbc/teste" auth="Container" type="javax.sql.DataSource" factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" username="root" password="x" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/eletro?autoReconnect=true" maxActive="5" maxIdle="5" maxWait="15000" validationQuery="select current_date" removeAbandoned="true" removeAbandonedTimeout="30" logAbandoned="true" />

Até aí tudo bem, porém para recuperar a conexão me indicaram esse exemplo (que funciona)

      Context context = new InitialContext();
      Context envCtx = (Context) context.lookup("java:comp/env");
      DataSource ds = (DataSource) envCtx.lookup("jdbc/teste");
			
      Connection conexao = ds.getConnection();

o meu problema é que tenho que recuperar uma fábrica: EntityManagerFactory para poder criar meus EntityManager’s pelo datasource JNDI.

Alguém sabe como posso fazer?
Já passaram por problemas parecidos na locaweb?

Depois de penar muito, consegui me conectar com o datasource feito no tomcat sem JTA

o datasource fica configurado no arquivo context.xml que fica na pasta conf do tomcat, ele fica assim

<!-- The contents of this file will be loaded for each web application -->
<Context>

    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
	
    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

<Resource 
name="jdbc/teste" 
auth="Container" 
type="javax.sql.DataSource" 
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" 
username="root" 
password="x" 
driverClassName="com.mysql.jdbc.Driver" 
url="jdbc:mysql://localhost:3306/eletro?autoReconnect=true" 
maxActive="5" 
maxIdle="5" 
maxWait="15000" 
validationQuery="select current_date" 
removeAbandoned="true" 
removeAbandonedTimeout="30" 
logAbandoned="true" /> 

</Context>

e o persistence.xml (fica na pasta META-INF no seu diretorio de fontes - src)

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
             version="1.0">
    <persistence-unit name="punit">
        <non-jta-data-source>java:comp/env/jdbc/teste</non-jta-data-source>       
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="none"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        </properties>
    </persistence-unit>
</persistence>

e pra recuperar o EntityManagerFactory fica normal, sem nenhuma alteração específica

EntityManagerFactory emf = Persistence.createEntityManagerFactory("punit");

pro pessoal que precisar ta aí

abraço…

Pablo,

mandou bem, estava com o mesmo problema seu e já estava desistindo, mas achei a solução no seu post.

Valeu.

eu fiz um teste seguindo a dica para mim não resolveu… :frowning:

java.lang.UnsupportedOperationException: Not supported by BasicDataSource at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:899) at org.hibernate.connection.DatasourceConnectionProvider.getConnection(DatasourceConnectionProvider.java:89) at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167) at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142) at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85) at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1353) at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:38) at br.com.gvt.cdi.dao.hibernate.LogDAO.save(LogDAO.java:131) at br.com.gvt.cdi.dao.hibernate.LogDAO.save(LogDAO.java:1) at br.com.gvt.cdi.bo.LogBO.save(LogBO.java:108) at br.com.gvt.cdi.bo.LogBO.logAcessoRetail(LogBO.java:51) 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:585) at flex.messaging.services.remoting.adapters.JavaAdapter.invoke(JavaAdapter.java:421) at flex.messaging.services.RemotingService.serviceMessage(RemotingService.java:183) at flex.messaging.MessageBroker.routeMessageToService(MessageBroker.java:1495) at flex.messaging.endpoints.AbstractEndpoint.serviceMessage(AbstractEndpoint.java:882) at flex.messaging.endpoints.amf.MessageBrokerFilter.invoke(MessageBrokerFilter.java:121) at flex.messaging.endpoints.amf.LegacyFilter.invoke(LegacyFilter.java:158) at flex.messaging.endpoints.amf.SessionFilter.invoke(SessionFilter.java:44) at flex.messaging.endpoints.amf.BatchProcessFilter.invoke(BatchProcessFilter.java:67) at flex.messaging.endpoints.amf.SerializationFilter.invoke(SerializationFilter.java:146) at flex.messaging.endpoints.BaseHTTPEndpoint.service(BaseHTTPEndpoint.java:278) at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:315) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 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:191) 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:845) 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:595) java.lang.UnsupportedOperationException: Not supported by BasicDataSource