JPA com JNDI na Locaweb

2 respostas
gigicantador

Estou tentando usar a JPA da Toplink com uma coneção por JNDI configurada pela Locaweb e não funciona. Minha aplicação não reconhece de forma alguma o “nome” de jndi que me passaram.

Reclamei em um chamado e responderam que a configuração realmente estava errada. :x Corrigiram e fizeram um teste na minha área com uma conexão em JSP que funciona:

Context context = new InitialContext();
Context lautx = (Context) context.lookup("java:comp/env");
ds = (DataSource)lautx.lookup("jdbc/jndiname");
conexao = ds.getConnection();
out.write("Conectado via JNDI!<br><br>");
Statement stmt= conexao.createStatement();
conexao.close();

Mas eu preciso que funcione com JPA… Aqui na minha máquina funciona (tomcat configurado por mim)
Alguém sabe se tem algum outro macete que preciso configurar para conseguir usar a persistência por JPA? :?: :?:
Minha configuração por JPA:

&lt;persistence-unit name="newsPU" transaction-type="JTA"&gt;
    &lt;provider&gt;oracle.toplink.essentials.PersistenceProvider&lt;/provider&gt;
    &lt;jta-data-source&gt;jdbc/jndiname&lt;/jta-data-source&gt;
    &lt;properties/&gt;
  &lt;/persistence-unit&gt;

Erro que aparece no log:

Caused by: javax.persistence.PersistenceException: Exception [TOPLINK-7060] (Oracle TopLink Essentials - 9.1 (Build b27)): oracle.toplink.esse
ntials.exceptions.ValidationException
Exception Description: Cannot acquire data source [jdbc/jndiname].
Internal Exception: javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
        at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:180)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:78)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:113
)

A propósito, tenho JVM dedicado.

2 Respostas

gigicantador

Cansei de tentar fazer a configuração por JTA JNDI funcionar…
Configurei meu persistence.xml para RESOURCE_LOCAL , mas o problema agora é o TIMEOUT do MYSQL da Locaweb…

Qualquer coisa que tento fazer o tempo expira. Fui informada de que o timeout lá é de 15 seg. Trocando a base para a de outros provedores (TIMOUT 20seg) funciona maravilhosamente bem.

Alguma sugestão para otimizar minha conexão via toplink?

Ou de um provedor de MySQL com timeout decente?

Grata

gigicantador

Consegui!

Bom, vou relatar aqui para deixar para a posteridade.
O HelpDesck da Locaweb me ajudou a encontrar a solução, no fórum da Oracle http://kr.forums.oracle.com/forums/thread.jspa?threadID=519351&tstart=127

Tenho que criar uma classe para prover a sessão de login:
public class ToplinkSessionCustomizer implements SessionCustomizer {

	/**
	 * Construtor
	 */
	public ToplinkSessionCustomizer() {
		super();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see oracle.toplink.essentials.tools.sessionconfiguration.SessionCustomizer#customize(oracle.toplink.essentials.sessions.Session)
	 */
	public void customize(Session session) throws Exception {
		JNDIConnector connector = (JNDIConnector) session.getLogin()
				.getConnector();
		connector.setLookupType(JNDIConnector.STRING_LOOKUP);
	}
}

E em meu persistence.xml:

&lt;persistence-unit name="newsPU" transaction-type="JTA"&gt;
		&lt;provider&gt;
			oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider
		&lt;/provider&gt;
		&lt;jta-data-source&gt;java:comp/env/jdbc/jndiname&lt;/jta-data-source&gt;
&lt;properties&gt;
			&lt;property name="toplink.session.customizer" value="a.b.c.ToplinkSessionCustomizer" /&gt;

Pronto, a jndi é encontrada!

Vale lembrar que tudo isso é porque a Locaweb que configura a JNDI no tomcat deles... O ideal é fazer um arquivo de contexto e configurar na aplicação.

Criado 21 de junho de 2008
Ultima resposta 24 de jun. de 2008
Respostas 2
Participantes 1