Pool de conexões + Toplink

0 respostas
A

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.

Criado 25 de abril de 2012
Respostas 0
Participantes 1