[Resolvido] Crud+Pool

14 respostas
Luciano_Lopes

Pessoal,tenho uma aplicação que esta usando muitas conexões do banco e consequentemente esta dando aquele erro de "too many connections". Estou fechando todas as conexões durante a manipulação dos dados, mesmo assim depois de um tempo atualizando registros,listando,etc o erro retorna. Pesquisei e me recomendaram usar um pool de conexões, configurei meu glassfish mas não sei como usar a conexão dentro do meu sistema. Meu método para conexão esta assim:

public java.sql.Connection getConnexao() throws SQLException{

        DataSource dataSource=null;
        try {
            InitialContext initialContext = new InitialContext();
            dataSource = (DataSource) initialContext.lookup("jdbc/RecursoPool");
            
        } 
        catch (Exception ex) {
            ex.printStackTrace();
        }  
       return dataSource.getConnection();
    }

Usei esse artigo como referencia:

http://rafaelomarques.wordpress.com/2011/01/31/configurando-pool-de-conexoes-com-mysql-e-glassfish-v3/

14 Respostas

tmvolpato

dessa maneira vc está apenas testando…

você tem um arquivo perstence.xml?
se tiver cole ai

Luciano_Lopes

Não tenho, como devo fazer? Estou usando jdbc+mysql

tmvolpato

entendi vc nao esta usando nenhum framework ORM
nunca fiz dessa maneira jdbc puro usando um pool

tmvolpato

isso pode te ajuda

http://pedroabs.wordpress.com/2011/09/27/connection-pool-em-java-pool-de-conexoes/

diogoprosoft

Eu fiz um tutorial um tempo atrás e nele eu mostro como criar uma aplicação completa com struts inclusive usando um pool de conexões

www.guj.com.br/posts/downloadAttach/3340.java

Luciano_Lopes

Meu método esta assim:

DataSource dataSource=null; try { InitialContext initialContext = new InitialContext(); dataSource = (DataSource) initialContext.lookup("jdbc/RecursoPool"); conexao=(Connection) dataSource.getConnection(); } catch (Exception ex) { ex.printStackTrace(); } return conexao; }

mas quando executo ele diz que o “RecursoPool” não existe

T
public Pool() throws NamingException
    {
	InitialContext initialContext = new InitialContext();
	dataSource = (DataSource) initialContext.lookup("jdbc/banco");

    }

    public Connection getConnection() throws SQLException
    {
	return dataSource.getConnection();
    }

Bom, voce precisa apenas disso!
Como está sua configuração no glassfish?

entre no console admin:
Vá em:
Resources -> JDBC Connection Pools -> clique sobre a conexão que voce criou.
Utilize o “ping” pra verificar se está conectado corretamente.

Depois, vá em:

Resources -> JDBC Resources -> clique sobre o resource.

No JNDI voce tem que por o mesmo lookup que vc vai utilizar no java, no seu caso, seria “jdbc/RecursoPool”, coloque exatamente isso.
Selecione a conexão que voce acabou de criar.

Bom, eu utilizo aqui assim, funciona perfeitamente.
Testa ae.
Flws


Edit:

Bom, voce disse que a msg é “o recurso não existe”. Ou voce não criou o recurso (o segundo passo que eu falei: Resources -> JDBC Resources). Ou, voce criou só “RecursoPool” e está procurando por “jdbc/RecursoPool”

Luciano_Lopes

Testei, deu esse erro:

SEVERE: java.lang.ClassCastException: com.sun.gjc.spi.jdbc40.ConnectionWrapper40 cannot be cast to com.mysql.jdbc.Connection
T

Esse erro aconteceu no glassfish? (ao clicar no ping?)
Qual driver (driver do banco, ex: jtds no caso do sqlserver, ou mysql-connector, etc.) vc tá usando?
Voce chegou a colocar o driver dentro da pasta do glassfish?

c:/glassfish3/glassfish3/domain/dominio/lib/ext

caso nao tenha feito isso, coloque e reinicie o glassfish.

Luciano_Lopes

O erro ocorreu quando executei a aplicação, o ping esta funcionado, o driver que estou usando é o mysql-connector

Luciano_Lopes

Alguem tenha ideia doque seja?

T

Nunca peguei esse erro… Vou tentar configurar no meu pc.

T

Fala ae cara. Boa noticia. rs

Consegui aqui. Apanhei um pouco, mas funcionou…
Vamos lá…

Vamos desde o inicio pra nao nos perdermos…

Primeiro, baixe o ultimo jdbc do mysql.
Eu utilizei esse: mysql-connector-java-3.0.17-ga-bin.jar

Coloque-o na pasta:
C:\glassfish3\glassfish\domains\domain1\lib\ext

Feito isso, acesse o console admin.
Depois, Resources -> JDBC Connection Pools -> new.
Preencha:
Pool Name:
Resource type: javax.sql.ConnectionPoolDataSource
DataBaseDriveVendor: Mysql.

Clique em Next.
Vá até o final da pagina e preencha os campos:
User:
DataBaseName:
Port:
Password:
ServerName.

Clique em finish.
Volte no que vc acabou de criar vá em additional Properties.
Tem que estar aparecendo:
User:
DatabaseName:
Port:
ServerName:
Password:

Por exemplo, no meu caso, ficou:
User: root
DatabaseName: test
Port: 3306
ServerName:localhost
Password:teste

Feito isso, basta criar o resource que será usado no Java.
Resources -> JDBC -> JDBC Resource -> new.

JNDI Name: jdbc/teste (o que eu coloquei, o mesmo que será usado no lookup)
PoolName:: O nome que foi utilizado na criação do pool.

Agora, é só utilizar no java.
No meu, ficou assim:

(Código apenas para testar, entao, ignore o jeito q foi feito…)

ManagedBean

import java.sql.SQLException;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.naming.NamingException;

@ManagedBean
@SessionScoped
public class UseClass {

	public String actTeste() throws SQLException, NamingException {
		System.out.println("chamouuuuuuuuuuuuuuuuuuu");
		new UsaConexao().UsarConexao();
		return null;
	}
}

Conexao. (No caso, utilizei apenas para teste, entao nao fechei conexao, nem fiz nada demais, mas nao se esqueça de fechar a conexao. con.close();

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.NamingException;

public class UsaConexao {
	Pool pool;

	public UsaConexao() throws NamingException {
		pool = new Pool();
	}

	public void UsarConexao() throws SQLException, NamingException {

		Connection con = pool.getConnection();
		PreparedStatement stmt = con.prepareStatement("select * from usuario");

		ResultSet executeQuery = stmt.executeQuery();

		while (executeQuery.next()) {
			System.out.println(executeQuery.getString("nome"));

		}
		System.out.println(con);
	}
}

Criacao da conexao

import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class Pool {
	private DataSource dataSource;

	public Pool() throws NamingException {
		InitialContext initialContext = new InitialContext();
		dataSource = (DataSource) initialContext.lookup("jdbc/teste");

	}

	public Connection getConnection() throws SQLException {
		return dataSource.getConnection();
	}
}

Bom, é isso. Aqui funcionou.
Verifique se os imports estao certos, e, qdo eu tava configurando pra mim, eu tive varios erros no começo, mas nenhum foi igual ao seu. Os erros foram corrigidos configurando corretamente o pool no console do glassfish, ou seja, o resto ja estava tudo certo.
Verifique tbm a versao do seu jar do mysql. Baixe o que eu testei.

Abrcs.

Luciano_Lopes

Funcionou! Minha lib do mysql tava errada, usei aqui você postou e funcionou, obrigado a todos!!! Resolvido!

Criado 4 de abril de 2013
Ultima resposta 5 de abr. de 2013
Respostas 14
Participantes 4