oi Kleber,
quando usei uma pequena aplicacao de servlets, criei uma "connection pooling", muito simples, mas que funcionou. Envio a classe
Na classe que eu estou precisando de uma conexao:
Con = Conexao.getInstancia();
Conn = Con.getCon(); // pega uma conexao
//executo o SQL
Con = Con.setCon(Conn); //devolve a conexao
Veja aí e me mande um retorno.
Ps. Algumas coisas tem que ser alteradas, pois na época que fiz nao tinha alguns conhecimentos....
[]'s
Era isso que vc queria?
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.DriverManager;
import java.lang.Integer;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.util.Vector;
/**
* Esta é a classe responsável por todas as conexoes peristentes
* no arquivo geral.properties deve-se colocar os atributos:
* jdbc.min = com o número mínimo de conxões. Ex.: 3
* jdbc.max = O número máximo de conexões. Ex. 20
* jdbc.databaseURL = a URL do banco de dados. Ex.: jdbc:interbase://almoxarifado/ALMOXARIFADO.GBD
* jdbc.driverName = o nome do driver do banco de dados. Ex.: interbase.interclient.Driver
* Esta classe deve ser acessada pelo método getInstancia, para pegar o único objeto que
* pode existir apartir desta classe e os métodos getCon e setCon para pegar e devolver Conexoes
* respectivamente
* Ex.:
* Connection Conn;
* try {
* Conn = Con.getCon();
* Con = Con.setCon(Conn);
* } catch(InterruptedException IE) {
* System.out.println("teste - erro ao devolver o obj");
* }
*
*/
public class Conexao{
// Variável para conservar o objeto do tipo Conexao na memória e ser chamado apenas uma vez
private static Conexao Con;
// O número mínimo de conexões
private static int min;
// O número máximo de conexões
private static int max;
// a URL do banco de dados
private static String databaseURL;
// O driver usado pelo banco
private static String driverName;
// armazenará as conexões
private static Vector vet;
//o número total de conexoes ja abertas ate agora
private static int nConTotal;
private final static String LOGIN = "SYSDBA";
private final static String PASSWORD = "nenhumasenha";
// setado com true caso ocorra erro na conexao
private static boolean flagErroConexao = false;
// setado com a descricao do erro
public static String msgErroConexao;
/**
* Este é o método inicial desta classe, funciona como se fosse um construtor
* Todas as classes externas devem chamá-lo
* Ele só deixa existir um objeto desta classe
* ATENÇÃO - Apenas UM objeto é criado a partir desta classe
* @return Conexao - O próprio objeto do tipo desta classe.
*/
public static Conexao getInstancia() {
if (Con == null) {
System.out.println("Conexao - Executando pela primeira vez");
Con = new Conexao();
}
return Con;
} // fim getInstancia
/**
* Este é o método inicial desta classe, funciona como se fosse um construtor
* Todas as classes externas devem chamá-lo
* Ele só deixa existir um objeto desta classe
* ATENÇÃO - Apenas UM objeto é criado a partir desta classe
* @param ncon Inteiro- o número de conexões a serem abertas, esse paramatro substitui o do arquivo.
* geralmente usado para teste
* @return Conexao - O próprio objeto do tipo desta classe.
*/
public static Conexao getInstancia(int ncon) {
if (Con == null) {
System.out.println("Conexao - Executando pela primeira vez");
Con = new Conexao(ncon);
}
return Con;
} // fim getInstancia
/**
* Devolve uma conexao colocando-a no array
* Lembre-se sempre de devolver as conexoes
* e que quem deve devolver é o objeto Conexao
* Ex.:
* Connection Conn;
* try {
* Conn = Con.getCon();
* Con = Con.setCon(Conn);
* } catch(InterruptedException IE) {
* System.out.println("teste - erro ao devolver o obj");
* }
* @param C a Connection que estava emprestada
* @return null sempre ira retornar nulo para a variavel que o chamou ser retirada da
* memória
*/
public synchronized Conexao setCon(Connection C) {
vet.add(C);
notifyAll(); //avisa as thread para acordarem
return null;
} //Fim setCon
/**
* Pega uma conexao, retirando-a do array
* Ex.:
* Connection Conn;
* try {
* Conn = Con.getCon();
* Con = Con.setCon(Conn);
* } catch(InterruptedException IE) {
* System.out.println("teste - erro ao devolver o obj");
* }
* @return Connection a conexao que será usada
* @throws InterruptedException
*/
public synchronized Connection getCon() throws InterruptedException {
if (flagErroConexao)
return null;
if ( (!(vet.isEmpty())) && (vet.size() != 0) )
return (Connection) vet.remove(0);
else
if ( (vet.size() != max) && (nConTotal != max) ) {
abreConnection();
nConTotal++;
return (Connection) vet.remove(0);
}
else {
wait(); //guarda até que o método notifyAll() ou notify() seja chamado
return getCon();
}
} //fim getCon
static {
try {
min = Integer.parseInt(func.getProperties("geral").getProperty("jdbc.min"));
max = Integer.parseInt(func.getProperties("geral").getProperty("jdbc.max"));
databaseURL = func.getProperties("geral").getProperty("jdbc.databaseURL");
driverName = func.getProperties("geral").getProperty("jdbc.driverName");
} catch (FileNotFoundException e) {
System.out.println(e.toString());
} catch (IOException e) {
System.out.println(e.toString());
}
} //fim bloco static
/** Construtor privado, pois só deve ser chamado uma vez por getInstancia()
* Este construtor inicaliza o vetor de conexoes e as poe dentro
*/
private Conexao(){
//obriga a rodar o método finalize()
System.runFinalization();
// cria o vetor de conexoes
vet = new Vector(min, 2);
System.out.println("Conexao - Abrindo conexoes. Aguarde ...");
abreTodasConnection();
if (!(flagErroConexao))
System.out.println ("Conexao - Conexoes estabelecidas total= " + min);
else {
System.out.println ("Conexao - Nenhuma conexao foi estabelecida devido a um erro");
vet = null;
}
} //fim const conexao
/** Construtor privado, pois só deve ser chamado uma vez por getInstancia()
* Este construtor inicaliza o vetor de conexoes e as poe dentro
*/
private Conexao(int ncon){
min = ncon;
//obriga a rodar o método finalize()
System.runFinalization();
// cria o vetor de conexoes
vet = new Vector(min, 2);
System.out.println("Conexao - Abrindo conexoes. Aguarde ...");
abreTodasConnection();
if (!(flagErroConexao))
System.out.println ("Conexao - Conexoes estabelecidas total= " + min);
else
System.out.println ("Conexao - Nenhuma conexao foi estabelecida devido a um erro");
} //fim const conexao
/**
* abre uma conexoes
* @throws ClassNotFoundException
* @throws java.sql.SQLException
*/
private synchronized static void abreConnection() {
try {
Class.forName (driverName);
} catch(ClassNotFoundException e) {
System.out.println("Conexao - Erro " + e);
}
try{
vet.addElement(DriverManager.getConnection (databaseURL, LOGIN, PASSWORD));
} catch(SQLException e) {
flagErroConexao = true;
msgErroConexao = e.toString();
System.out.println("Conexao - Erro: "+ e);
}
} //fim abreConexoes
/**
* abre TODAS conexoes até o número mímino definido em min
* @throws ClassNotFoundException
* @throws java.sql.SQLException
*/
private synchronized static void abreTodasConnection() {
for (int i=0 ; i< min; i++) {
System.out.print(i+"-");
abreConnection();
}
nConTotal = min;
System.out.println("");
} //fim abreTodasConexoes
/**
* fecha todas as conexoes existentes retirando-as do vetor
* @throws java.sql.SQLException
*/
private synchronized static void fechaConnection() {
while ( !(vet.isEmpty()) ) {
Connection com = (Connection) vet.remove(0);
try {
com.close();
com = null;
} catch(SQLException e) {
System.out.println("Conexao - Erro ao fechar conexão: " + e);
}
} //fim while
} // fim fechaConnection
/**
* método finalize é chamado momentos antes do objeto deixar a memória
* Este método é usado para fechar as conexoes
* Este método sobrepoe da classe Object
* @return void - Sem Retorno
* @see java.lang.Object#finalize()
*/
protected void finalize() throws Throwable {
System.out.println("Conexao - Fechando as conexões. Aguarde ... ");
fechaConnection();
System.out.println("Conexao - Conexões fechadas com exito ");
}
}// Fim aux
Atenciosamente
PAULO BRANCO
DIRETIVA DIGITAL
Kleber Rodrigo Carvalho <[EMAIL PROTECTED]>
02/05/2002 15:55
|
To: [EMAIL PROTECTED], [EMAIL PROTECTED] cc: Subject: [java-list] Connection Pooling |
PessoALL
Estou tentando construir um pool de conexão aqui, mas
de cara entrei neste site da sun, baixei os exemplos e
na hora de compilar ele dá erro.
Estou usando o jdk 1.3.1.
http://developer.java.sun.com/developer/onlineTraining/Programming/JDCBook/conpool.html
Pq será o erro ?
Este pool é uma bom exemplo para se usar no dia a dia
?
Obrigado
Kleber Rodrigo de Carvalho
ps.: Desculpa pelo anexo
__________________________________________________
Do You Yahoo!?
Yahoo! Health - your guide to health and wellness
http://health.yahoo.com------------------------------ LISTA SOUJAVA ----------------------------
http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
historico: http://www.mail-archive.com/java-list%40soujava.org.br
para sair da lista: envie email para [EMAIL PROTECTED]
-------------------------------------------------------------------------
pool.zip
Description: Zip archive
------------------------------ LISTA SOUJAVA ---------------------------- http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP dúvidas mais comuns: http://www.soujava.org.br/faq.htm regras da lista: http://www.soujava.org.br/regras.htm historico: http://www.mail-archive.com/java-list%40soujava.org.br para sair da lista: envie email para [EMAIL PROTECTED] -------------------------------------------------------------------------