Oi pessoal, vamos ver se alguém consegue me ajuda com esse problema. Aqui na empresa onde trabalho não é viavel que utilizemos um pool de conexões feito no tomcat, já realizei vários testes mas o comitê optou por não utiliza-lo e encontrar uma maneira alternativa. Já conheço (por vista) c3po, dbcp e bonecp, mas não faço idéia de qual deles é o melhor para se utilizar com jpa toplink e nem como configurar. A forma como eu fiz aqui está abrindo muitas conexões e dependendo do tempo parado, consigo pegar um erro de comunicação com o banco de dados, ele não consegue mantê-las ativas fazendo-se necessário a reinicialização das instâncias do servidor.
Como eu faço atualmente. No persistence.xml eu crio uma unidade de persistência para a minha tabela:
<persistence-unit name="arh" transaction-type="RESOURCE_LOCAL">
<provider>oracle.toplink.essentials.PersistenceProvider</provider>
<class>br.com.bb.arh.modelo.FuncionarioArh</class>
<properties>
<property name="toplink.cache.shared.default" value="false"/>
<property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="toplink.jdbc.url" value="jdbc:mysql://servidor:3306/arh"/>
<property name="toplink.jdbc.user" value="arh"/>
<property name="toplink.jdbc.password" value="senhaarh"/>
</properties>
</persistence-unit>
Após a unidade ser criada, eu crio um arquivo para buscar a conexão pelo nome da unidade:
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class Arh {
protected EntityManagerFactory emf;
public EntityManagerFactory getEMF (){
if (emf == null){
emf = Persistence.createEntityManagerFactory("arh", new java.util.HashMap());
}
return emf;
}
}
e para utilizar, eu invoco chamando o nome do meu recurso para utilizar os métodos.
public class Controle implements java.io.Serializable {
EntityManagerFactory emf;
private EntityManager em;
public Controle(EntityManagerFactory resource) {
this.emf = resource;
em = (EntityManager) emf.createEntityManager();
}
//aqui vão métodos de persistência e consultas
}
Exemplo de utilização em uma classe:
public class ControlePortal implements java.io.Serializable {
static Controle dao;
public ControlePortal() {
dao = new Controle(new Arh().getEMF()); //aqui eu chamo o recurso que deve ser estabelecida a conexão
}
//a partir daqui eu utilizo a conexão aberta e armazenada no dao
}
tenho que encontrar uma forma de criar o pool estando dentro da aplicação, tendo em vista que trabalhamos aqui com mais de 10 instâncias do tomcat, por isso não é viável criar o pool direto no tomcat, senão teríamos que editar o xml de todas as 10 instâncias todas as vezes que um aplicativo fosse criado, e como sempre temos que criar novos, acabaria atrasando quebrando o rendimento.