Servlets e conexões

8 respostas
C

Boa tarde,

Estou com o seguinte problema. Estou usando servlets para fazer conexão a um banco Interbase. Um servlet chama outro servlet e cada servlet que eu chamo acabo fazendo mais uma conexão ao banco. Porém depois de um certo número de conexões, elas ultrapassam o limite do banco e dá erro.
    Pergunta: Como posso fazer para que eu faça apenas uma conexão ao banco (na primeira vez uma servlet é chamada) e depois continuo com a mesma conexão aberta,  para todas as outras servlets, sem que eu precise fazer uma conexão novamente. :(

8 Respostas

S

Você deve centralizar a conexão com o banco numa classe especifica e todas as servlets recuperariam a conexao a partir desta classe.

public class GerenciadorConexao {

    private Connection conexao = null;

    public GerenciadorConexao () {
        // aqui vc cria sua conexao
    }

    public Connection getConexao() {
        return this.conexao;
    }

}

Apesar de ser uma solução definitivamente não é a melhor. O ideal seria abstrair o acesso aos dados através de uma camada específica para acesso a dados.

C

E como faço a chamada aos métodos desta classe nos meus servlets ?
Como faço para verificar se já há uma conexão aberta ?

H

Você poderia implementar um Pool de Conexão, ele resolve seu problema.

C

Heber,

Segue um PoolConection mas não está faznedo conexão ao banco:

import java.util.;
import java.sql.
;

public class PoolConexao

{

private Hashtable connections = new Hashtable();

private Properties props;
public PoolConexao (Properties props, int conexaoinicial)

throws SQLException, ClassNotFoundException

{
this.props = props;
   initializePool(props, conexaoinicial);

}

public PoolConexao (String driverClassname, String dbUrl, String user, String password,int conexaoinicial)

throws SQLException, ClassNotFoundException

{

props = new Properties();

props.put(connection.driver,driverClassname);

props.put(connection.url,dbUrl);

props.put(user,user);

props.put(password,password);

initializePool(props,conexaoinicial);

}
public Connection getConnection() throws SQLException

{

Connection con = null;

Enumeration cons = connections.keys();

synchronized (connections) {

while (cons.hasMoreElements()) {

con = (Connection)cons.nextElement();

Boolean b = (Boolean)connections.get(con);

if (b == Boolean.FALSE)

{

try

{

con.setAutoCommit(true);

}

catch (SQLException e)

{

connections.remove(con);

con = getNewConnection();

}

connections.put(con,Boolean.TRUE);

System.out.println(conectou - 1);

return con;

}

}

con = getNewConnection();

connections.put(con, Boolean.FALSE);

System.out.println(conectou - 2);

return con;

}

}
public void returnConnection(Connection returned)

{

if (connections.containsKey(returned))

connections.put(returned, Boolean.FALSE);

}
private void initializePool(Properties props,int conexaoinicial)

throws SQLException, ClassNotFoundException

{

Class.forName(props.getProperty(connection.driver));

for (int i = 0; i < conexaoinicial; i++)

{

Connection con = getNewConnection();

connections.put(con, Boolean.FALSE);

}

}
private Connection getNewConnection()

throws SQLException

{

return DriverManager.getConnection(props.getProperty(connection.url),props);

}

}
H

Ele retorna algum erro ?

C

Não.

C

Estou usando uma classe para gerenciar a conexão ao banco como está listado abaixo:

import <a href="http://java.io">java.io</a>.<em>;

import javax.servlet.</em>;

import javax.servlet.http.<em>;

import java.sql.</em>;

import java.util.*;

public class GerenciadorConexao {

private Connection conexao = null; 

public GerenciadorConexao () { 
    // aqui vc cria sua conexao 
    String jdbcDriver = "interbase.interclient.Driver";
String jdbcSubProtocol = "jdbc:interbase://localhost/";
    String dbName = "c:/monografia/eleicao.gdb";
    String dbUser = "SYSDBA";
    String dbPasswd = "masterkey";
    try
        {
          Class.forName(jdbcDriver);
          conexao = DriverManager.getConnection(jdbcSubProtocol + dbName, dbUser, dbPasswd);
          System.out.println("Banco conectado pelo gerenciador");
        }
     catch (Exception e)
        {
          System.out.println("Banco não conectado !!");
        }

} 

public Connection getConexao() { 
    return this.conexao; 
}

}

Pergunta: como faço para que minha servlet chame esta classe e faça apenas uma conexão ao banco que possa ser usado pelas servlets seguintes ?

M

sete a conexão como atributo da aplicação, “shareie” (compartilhe) o objeto:

Criado 7 de abril de 2004
Ultima resposta 14 de abr. de 2004
Respostas 8
Participantes 4