Retroceder   Foros del Web > Programación para sitios web > Java y JSP

Respuesta
 
Herramientas Desplegado
Antiguo 10-nov-2003, 12:44   #1 (permalink)
AleXerTecH está en el buen camino
 
Avatar de AleXerTecH
 
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 731
Cool Ayuda Urgente!!! PoolDeConexiones en SERVLETS

Hola a todos!!

Tengo un tema por ally de "potencia de mis java servlets" en el que se armaron unas buenas cuestiones.

Lo cierto del caso es que apartir de ese tema fue que decidi hacer este para ver quien me ayuda;

Necesito crear un Servlet maestro que ADMINISTRE las conexiones a la BD.

Tengo un sistema de casi 200 servlets, y cada uno realiza una conexion unica, y necesito que en vez de que ellos hagan la conexion le preguten al pool, este les de la conexion y luego el servlet la devuelva al pool para que este la cierre.

Espero haberme explicado bien.

El metodo por el cual hago mi conexion a la bd es:

"ATENCION, DICE PHP, ES PORQUE ESTOY USANDO LA ETIQUETA DE PHP PARA QUE LE SALGAN LOS COLORES, PERO ESTO ES JAVA SERVLETS!!!"

Código PHP:
public  void init (ServletConfig configthrows ServletException {

    
super.init(config);
    try {
       Class.
forName("sun.jdbc.odbc.JdbcOdbcDriver");
                  
conn=DriverManager.getConnection("jdbc:odbc:BASEDATOS","USER","PASS");

    }catch (
ClassNotFoundException e) {
      throw new 
UnavailableException (this"Couldnt find class "+e.getMessage());
    }catch (
SQLException se) {
      
System.out.println("!!!SQL Exception caught: " se);
        }

    } 
Cada servlet tiene este sistema de conexion, que quiero ahora que lo contenga uno solo para que las administre.

Si no entienden bien la cuestion dense una vuelta por este mensj Potencia de mis JAVAServlets!!!????

Me vendria bien algo de codigo, GRACIAS!!!!!
__________________
Alex Barrios
www.alexertech.com

"Piensa como una persona de acción y actúa como una persona que piensa."
AleXerTecH está desconectado   Responder Citando
Antiguo 10-nov-2003, 15:45   #2 (permalink)
susaniux está en el buen camino
 
Avatar de susaniux
 
Fecha de Ingreso: diciembre-2002
Mensajes: 21
Enviar un mensaje por ICQ a susaniux
Yo tenia entendido que quien implementa el pool de conexiones ya es en si el "driver" , quien al fin de cuentas es el que debe de administrar los objetos de conexion.

?
__________________
:-P*****;-)
susaniux está desconectado   Responder Citando
Antiguo 10-nov-2003, 16:59   #3 (permalink)
AleXerTecH está en el buen camino
 
Avatar de AleXerTecH
 
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 731
No entendi eso....

Dame un ejemplo de codigo o algo...

Explicate mejor

Gracias!!!
__________________
Alex Barrios
www.alexertech.com

"Piensa como una persona de acción y actúa como una persona que piensa."
AleXerTecH está desconectado   Responder Citando
Antiguo 10-nov-2003, 20:31   #4 (permalink)
Iv4n está en el buen camino
 
Fecha de Ingreso: enero-2003
Mensajes: 52
Enviar un mensaje por ICQ a Iv4n Enviar un mensaje por Yahoo  a Iv4n
Hola

Sobre Connection Pooling, generalmente esto lo tienes que implementar por tu propia cuenta. Aunque algunos app servers ya lo traen, en la mayoria de los sistemas se usa uno desarrollado in-house.


El connection pooling consiste en evitar abrir las conexiones directamente y en lugar de ello, utilizar un Layer donde tengas un componente que administre las utilizacion de las conexiones.

Esto puede ser implementado en una clase donde a traves de un metodo sincronizado, se pida una conexion, entonces el connection pool, revisa entre su vector de conexiones, alguna que no este en uso, entonces, la devuelve. Al terminar de usarla desde tu clase donde tengas la logica de acceso a datos, puedes invocar algun metodo release, que le indique al pool que esa ya no la vas a usar.


En fin, esta interesante, buscate algo del topico "Connection Pooling" veras que te salen muchas paginas con mas detalles.



Saludos!!
__________________
1V4N03A
Iv4n está desconectado   Responder Citando
Antiguo 11-nov-2003, 10:55   #5 (permalink)
GreenEyed tiene algunos puntos positivos de karma
 
Fecha de Ingreso: octubre-2003
Mensajes: 2.485
Hola,
Normalmente los contenedores de servlets ya suelen implementar este tipo de pools, asi que mirate la documentacion del que utilices a ver que te dice. Por ejemplo, si usas Tomcat 5 (es un suponer), la página a mirar es esta:
http://jakarta.apache.org/tomcat/tom...les-howto.html
Sobre todo la parte de ejemplos. Nosotros usamos el Resin y tiene algo parecido, etc...
PD: Repito lo de "cuidado con el ODBC-JDBC bridge" ;).
Saludos
__________________
TAANSTAFL - Para obtener respuestas inteligentes, lo mejor es empezar por preguntar de forma inteligente.
GreenEyed está desconectado   Responder Citando
Antiguo 12-nov-2003, 07:45   #6 (permalink)
bakanzipp está en el buen camino
 
Avatar de bakanzipp
 
Fecha de Ingreso: noviembre-2002
Ubicación: santiago de shilli
Mensajes: 2.554
Enviar un mensaje por ICQ a bakanzipp
para manejar un pool de conexion yo trabajo de la siguiente manera (a ver si te sirve, en mi caso me conecto con sql server 7.0 y con tomcat)..

1ro
declaro en el turbineResource.properties el string de conexion

Código PHP:
## Database SQL Server
database.conector.driver=com.inet.tds.TdsDriver
database
.conector.url=jdbc:servidor:1433?database=mi_base
database
.conector.username=sa
database
.conector.password
2do
cree una clase que maneja el pool

Código PHP:

import org
.apache.turbine.services.resources.TurbineResources;
import org.apache.turbine.util.Log;

import java.sql.*;
import java.util.Vector;

public class 
SQLServerJDBC
{
    
String driver "";
    
String url "";
    
String login "";
    
String password "";
    
int codError 0;
    
String mensajeError "";

    
Connection connection null;

    public 
SQLServerJDBC()
    {
        try
        {
            
driver TurbineResources.getString("database.conector.driver""");
            
url TurbineResources.getString("database.conector.url""");
            
login TurbineResources.getString("database.conector.username""");
            
password TurbineResources.getString("database.conector.password""");

            Class.
forName(driver);

            
DriverManager.setLoginTimeout(30);
            
connection DriverManager.getConnection(urlloginpassword);
            
connection.setAutoCommit(false);
        }
        catch(
Exception e)
        {
            
Log.error(e);
            
codError 1;
            
mensajeError e.toString();
        }
    }

    public 
boolean doCommit()
    {
        
clearError();
        try
        {
            
connection.commit();
        }
        catch(
Exception e)
        {
            
Log.error(e);
            
codError 1;
            
mensajeError e.toString();
            return 
false;
        }
        return 
true;
    }

    public 
boolean doRollback()
    {
        
clearError();
        try
        {
            
connection.rollback();
        }
        catch(
Exception e)
        {
            
Log.error(e);
            
codError 1;
            
mensajeError e.toString();
            return 
false;
        }
        return 
true;
    }

    public 
Vector doSelect(String sql)
    {
        
Vector data = new Vector();
        
clearError();
        try
        {
            
Statement st connection.createStatement();
            
ResultSet rs st.executeQuery(sql);

            while (
rs.next())
            {
                
Vector rec = new Vector();
                for (
int i 1<= rs.getMetaData().getColumnCount(); i++)
                {
                    
rec.addElement(rs.getObject(i));
                }
                
data.addElement(rec);
            }
            
st.close();
        }
        catch(
Exception e)
        {
            
Log.error(e);
            
codError 1;
            
mensajeError e.toString();
            return new 
Vector();
        }
        return 
data;
    }

3ro instancio la conexion desde mis servlets

Código PHP:
import org.apache.velocity.context.Context;
import org.apache.turbine.util.Log;

import java.lang.Integer;
import java.lang.String;
import java.util.Date;
import java.util.Vector;
import java.util.Hashtable;
import java.util.Enumeration;
import java.text.SimpleDateFormat;
import com.package.modulo.util.SQLServerJDBC;


public class 
mi_clase
{
    
SQLServerJDBC jdbc null;


     public 
Vector Operacion(Hashtable tablaVector detalle)
    {
      try
      {
            
jdbc = new SQLServerJDBC();
            
String sql "";
            
Vector data_ null;

            
sql "select * from tabla";

            
sql "select * from tabla";
            
data_ jdbc.doSelect(sql);

            if (
data_ == null || data_.size() < 1)
            {
                
jdbc.doRollback();
                
jdbc.doClose();
                return 
false;
            }    }
      catch(
Exception e)
      {
            
Log.error(e);
      }
        return 
data_;
    }


saludos
bakanzipp está desconectado   Responder Citando
Antiguo 12-nov-2003, 07:52   #7 (permalink)
AleXerTecH está en el buen camino
 
Avatar de AleXerTecH
 
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 731
MUCHISIMAS GRACIAS POR ESE CODIGO!! AHORA TENGO MAS POR DONDE GUIARME.

SOLO 2 PREGUNTICAS:

Podrias explicarme el funcionamiento de esta linea?

import org.apache.turbine.services.resources.TurbineResou rces;
import org.apache.turbine.util.Log;




DriverManager.setLoginTimeout(30);




import com.package.modulo.util.SQLServerJDBC




public boolean doCommit()
{
clearError();
try
{
connection.commit();
}
catch(Exception e)
{
Log.error(e);
codError = 1;
mensajeError = e.toString();
return false;
}
return true;
}







Vector rec = new Vector();
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++)
{
rec.addElement(rs.getObject(i));
}
data.addElement(rec);





Y, donde va el servlet controlador? en la misma carpeta de las aplicaciones???


DENUEVO, MUCHISIMAS GRACIAS!!!!!
__________________
Alex Barrios
www.alexertech.com

"Piensa como una persona de acción y actúa como una persona que piensa."
AleXerTecH está desconectado   Responder Citando
Antiguo 12-nov-2003, 11:31   #8 (permalink)
bakanzipp está en el buen camino
 
Avatar de bakanzipp
 
Fecha de Ingreso: noviembre-2002
Ubicación: santiago de shilli
Mensajes: 2.554
Enviar un mensaje por ICQ a bakanzipp
Código PHP:
import org.apache.turbine.services.resources.TurbineResources;
import org.apache.turbine.util.Log

estas dos lineas la uso para poder usar los metodos instanciados en estas clases que me sirven para leer lo que hay dentro de mi archivo turbineResource.properties que en este caso es el string de conexion configurado en este archivo, el log lo utilizo para generar un archivo Turbine.log pero en este caso le quite el comentario de mis logs.

Código PHP:
DriverManager.setLoginTimeout(30); 
espera conectarse a la base de datos por 30 segundos, si no lo hace arrojara el correspondiente mensaje de error

Código PHP:
public boolean doCommit() 
despues de hacer cualquier trx con la base de datos (gralmente delete,insert,update) realizo un commit; para que el cambio se refleje en la base de datos.

Código PHP:
for (int i 1<= rs.getMetaData().getColumnCount(); i++)
{
rec.addElement(rs.getObject(i));

los datos que te devuelve la consulta son almacenados en un resultset, este lo recorro y se lo agrego a un vector.

saludos
bakanzipp está desconectado   Responder Citando
Antiguo 12-nov-2003, 13:09   #9 (permalink)
AleXerTecH está en el buen camino
 
Avatar de AleXerTecH
 
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 731
Hola, gracias de nuevo.

Una ultima cosilla:

import org.apache.turbine.services.resources.TurbineResou rces;
import org.apache.turbine.util.Log;


Estas lineas me dan error.

Me faltara alguna cosa? tengo el jsdk 1.4.2, y lo trabajo con netBeans 3.5.1 y tomcat 5.0


Gracias!!!
__________________
Alex Barrios
www.alexertech.com

"Piensa como una persona de acción y actúa como una persona que piensa."
AleXerTecH está desconectado   Responder Citando
Antiguo 13-nov-2003, 06:07   #10 (permalink)
bakanzipp está en el buen camino
 
Avatar de bakanzipp
 
Fecha de Ingreso: noviembre-2002
Ubicación: santiago de shilli
Mensajes: 2.554
Enviar un mensaje por ICQ a bakanzipp
eso es lo de menos, si no tienes el turbineResources puedes guardar el string de conexion en el web xml o en algun archivo de texto y leerlos desde tus servlets.

saludos
bakanzipp está desconectado   Responder Citando
Antiguo 13-nov-2003, 06:30   #11 (permalink)
AleXerTecH está en el buen camino
 
Avatar de AleXerTecH
 
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 731
bakanzipp de verdad gracias!, agarre tu codigo y le hice algunas modificaciones y logre conectar a la base de datos pero tengo un ultimo problema (aparentemente)...

En esta linea logro la conexion sin problemas

jdbc = new SQLServerJDBC();
String sql = "";
Vector data_ = null;

sql = "select * from tabla";

sql = "select * from tabla";
data_ = jdbc.doSelect(sql);


Pero como hago para lograr el efecto que tenia antes???

Porque no se como hacer para usar los datos que regresa....

Antes tenia el resultSet en el mismo servlet, y de ally llenaba tablas, datos y varias cosas....

De esta manera :

Código PHP:
                                        stmt conn.createStatement();
                                        
String SQL "SELECT ";
                                        
SQL+=column1;
                                        
SQL+=",";
                                        
SQL+=column2;
                                        
SQL+=" FROM ";
                                        
SQL+=table;
                                        
SQL+=" WHERE CodX='";
                                        
SQL+=codpades;
                                        
SQL+="'";
                                        
SQL+=" ORDER By ";
                                        
SQL+=column2;
                                        
ResultSet rs stmt.executeQuery(SQL);

                                        if (
rs.next()){
                                                        
combo "";
                                                        do{
                                                                
codigo = (rs.getInt(column1));
                                                                
valor = (rs.getString(column2));

                                                                
combo += "<option> ";
                                                                
combo += valor;
                                                                
combo += "</option>\n";
                                                        }while(
rs.next());
                                            }
´ 

Ves que con el rs. me muevo por la tabla y demas.

Como implemento esto para conseguir esos datos??????
__________________
Alex Barrios
www.alexertech.com

"Piensa como una persona de acción y actúa como una persona que piensa."
AleXerTecH está desconectado   Responder Citando
Antiguo 13-nov-2003, 07:04   #12 (permalink)
bakanzipp está en el buen camino
 
Avatar de bakanzipp
 
Fecha de Ingreso: noviembre-2002
Ubicación: santiago de shilli
Mensajes: 2.554
Enviar un mensaje por ICQ a bakanzipp
a verr...

primero que todo tendrias que cambiar la salida al metodo doSelect para que en vez de retornar un vector retorne un resulset

public Resultset doSelect(Hashtable tabla, Vector detalle)...esto nunca lo he hecho, retornar un resultset pero me imagino que se podra..o no?..jjejejej

Código PHP:
public ResultSet doSelect(String sql)

    {

        
clearError();

        try

        {

            
Statement st connection.createStatement();



            
ResultSet rs st.executeQuery(sql);

            
st.close();

        }

        catch(
Exception e)

        {

            
Log.error(e);

            
codError 1;

            
mensajeError e.toString();

            return new 
Vector();

        }

        return 
data;

    } 
y cuando llames al doSelect tendras el resultset y ahi podras manejarlo..

rs = jdbc.doSelect(sql);

donde rs es un resultset...si te das cuenta el metodo public Vector Operacion(Hashtable tabla, Vector detalle) igual devuelve un vector...ese tambien tendrias que modificarlo...o desde ese mismo metodo recorrer el resultset y enviar los datos hacia afuera....saludos.
bakanzipp está desconectado   Responder Citando
Antiguo 13-nov-2003, 07:48   #13 (permalink)
AleXerTecH está en el buen camino
 
Avatar de AleXerTecH
 
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 731
Ok amigo bakan...

Este es el codigo de mi pool de conexiones, corrigeme si me equivoco, ya logre todo, pero quiero saber si de verdad esto abre y cierra la conexion a la bd para adiminstrarlas....

Código PHP:
package XAlX;


import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import java.util.Vector;

public final class 
poolBaseDatos
{

    
String driver "";
    
String url "";
    
String login "";
    
String password "";
    
int codError 0;
    
String mensajeError "";
    
Statement st=null;
    
    
Connection connection null;

    public 
poolBaseDatos() 
    {
        try
        {
            
            
driver = ("sun.jdbc.odbc.JdbcOdbcDriver"); 
            
url = ("jdbc:odbc:XDB"); 
            
login = ("xa"); 
            
password = ("skl");

            Class.
forName(driver);

            
DriverManager.