Foros del Web » Programación para mayores de 30 ;) » Java »

Potencia de mis JAVAServlets!!!????

Estas en el tema de Potencia de mis JAVAServlets!!!???? en el foro de Java en Foros del Web. Hola a todos!! Llevo ya varios meses en mi trabajo desarollando una aplicacion web basada en servlets de java. El producto se espera que reciba ...
  #1 (permalink)  
Antiguo 04/11/2003, 07:05
Avatar de alexbariv  
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 766
Antigüedad: 21 años, 3 meses
Puntos: 0
Potencia de mis JAVAServlets!!!????

Hola a todos!!

Llevo ya varios meses en mi trabajo desarollando una aplicacion web basada en servlets de java.

El producto se espera que reciba miles de conexiones al dia, el manejador de base de datos es lo de menos, pero quiero saber si estos servlets podran aguantar todos esos request and response con velocidad.

Estan programados de una manera muy individualista, es decir, cada servlet hace lo suyo sin depender de otras clases (a excepcion de las basicas), sus funciones son conectarse a la base de datos e Insertar, Modificar, y Eliminar de acuerdo a la peticion del usuario y del form html que lo llama.

Hay 20 tablas (como minimo) en la base de datos, y hay 4 servlets para cada tabla, el que inserta, el que modifica, el que elimina, y el que busca.

Lo pense asi es porque si divido 1000 conexiones a 4 servlets de acuerdo al tipo de peticion (ins,mod,eli), es mejor que mandar 1000 conexiones a 1 servlet que decida cual de las 4 va a hacer.

Bueno, que piensan?, que tan eficiente creen mi sistema? si aguantara lo que digo? Que manejador de Bases de datos recomiendan?

Yo estoy trabajando con el Adaptive Server Anywhere 8, que es de la sybase y se porta bastante bien.

Espero sus opiniones!

GRACIAS!!!
__________________
"Piensa como una persona de acción y actúa como una persona que piensa."
  #2 (permalink)  
Antiguo 04/11/2003, 07:22
Avatar de bakanzipp  
Fecha de Ingreso: noviembre-2001
Ubicación: santiago de shilli
Mensajes: 2.554
Antigüedad: 23 años, 1 mes
Puntos: 0
Hola.

Si separaste tus procesos de transacciones y tu forma de programar es correcta no veo por que tengas problemas de sobrecarga, de todas formas la forma que te conectas a la b de datos es un punto muy importante ya que hay que depurar este proceso porque es el mas utilizado, tener cuidado de liberar y destruir las conexiones cada vez que se suelten es un punto vital. al igual que usar un finally en todos tus metodos que usan conexiones con la base de datos para liberar los objetos en caso de cualquier evento extraño.

con respecto al motor si es de sybase debe er potente y debe manejar bien el tema de la concurrencia, otros motores potentes si no te satisface este podria ser oracle o db2.

saludos.
  #3 (permalink)  
Antiguo 04/11/2003, 07:43
Avatar de alexbariv  
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 766
Antigüedad: 21 años, 3 meses
Puntos: 0
cerrar conexiones... mmm??

Bueno, lo cierto del caso, y quisiera saber si lo estoy haciendo bien, es que yo creo las conexiones con esta sintaxis

Connection conn = null;

public void init (ServletConfig config) throws ServletException {
super.init(config);
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn=DriverManager.getConnection("jdbc:odbc:nombre 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);
}

}


Y luego mi codigo tiene esto, que es el destroy:



public void destroy(){
super.destroy();
System.out.println("Cerrando conexión ....");
try{
conn.close();
}catch (SQLException ex){
System.out.println("No se pudo cerrar la conexión ");
System.out.println(ex.getMessage());
}
}




Pero yo solo dejo el destroy asi, y el cuando cierra las conexiones, (Supuestamente), sera correcto?

Que dicen???

Hay otro metodo de cerrar conexiones a la bd?
__________________
"Piensa como una persona de acción y actúa como una persona que piensa."
  #4 (permalink)  
Antiguo 04/11/2003, 12:23
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 2 meses
Puntos: 51
Hola,
Asi por puntos...:
.- Dividir las peticiones en servlets diferentes no implica un gran beneficio en rendimiento y si implica una carga importante en cuanto a mantenimiento. Los contenedores de servlets crean varias instancias de cada uno de ellos para servir las diferentes peticiones concurrentemente, asi que al fin y al cabo no ganas mucho. De hecho usar UN solo servlet se usa mucho y se conoce como la tecnica de "servlet controlador".
.- Crear una conexion en el init de un servlet y cerrarla en el destroy está totalmente desrecomendado. Ten en cuenta que el destroy lo puede llamar el contenedor CUANDO QUIERA y asi tendras abiertas siempre (4*20) 80 conexiones a BDD que ademas se reutilizaran dentro de un mismo servlet, por lo que habras de sincronizar el acceso a esa conexion en cada servlet... Yo te recomendaria usar un pool de conexiones.
.- En este tipo de aplicaciones, el motor de BDD no es lo de menos, si no que es muy muy importante. Seguramente sera el cuello de botella de tu aplicacion y tendras que optimizar el esquema de la BDD muy cuidadosamente (indices, etc...) y calibrar adecuadamente el numero de conexiones que tengas abiertas para no sobrecargarla.
.- Si el problema más importante que crees que te vas a encontrar es mucho tráfico, más que necesidad de evolucionar, flexibilidad, etc.. mis consejos serían: Mantén tu diseño sencillo y facil de depurar/controlar; especial cuidado en cuanto a la sincronización y el acceso a las conexiones de BDD y a la gestión y liberación de objetos; optimiza el accesso a la BDD y prevee un buen sistema de trazas por si las cosas van mal.
Al menos, eso es lo que a mi me ha ayudado en sistemas asi.
Suerte.
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #5 (permalink)  
Antiguo 04/11/2003, 12:40
Avatar de alexbariv  
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 766
Antigüedad: 21 años, 3 meses
Puntos: 0
Muchisimas gracias por tu respuesta!

Veo que me puedes ayudar un poquito si no es mucha molestia.

De verdad quiero mejorar la eficiencia de mi sistema, ya que esta a punto de ser vendido, y aun tengo tiempo para optimisarlo.

Lo de unir a un solo servlet que consulte, modifique y elimine, era una idea que tenia hace tiempo, pero el sistema tiene que estar para hacer un request de 500 o 1000 conexiones al mismo tiempo, por eso pense en dividirlo, es cierto que es un rollo a nivel de mantenimiento, pero bueno....

Dime, que me recomiendas, que codigo pongo, o donde me meto para saber como administrar bien las conex.

Si tienes un codigo a la mano, para cerrar conexiones cuando yo quiera, o mejorar el sistema de conexiones, te lo agradeceria ENORMEMENTE!!

GRACIAS DE ANTEMANO!!!!!!!!!!!
__________________
"Piensa como una persona de acción y actúa como una persona que piensa."
  #6 (permalink)  
Antiguo 04/11/2003, 13:27
Avatar de alexbariv  
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 766
Antigüedad: 21 años, 3 meses
Puntos: 0
Hablando de mis conexiones.

Aun busco sugerencias pero para que vean como las establesco, asi los que no sepan, aprendan con mi post, y los que sepan me ayuden.

Miren esto:

En la segunda parte de este post menciono el metodo para conectarme y el destroy., como veran la conexion se establece con

conn=DriverManager.getConnection("jdbc:odbc:nombre basedatos","user","pass");


ok, luego viene el destroy, y bla bla bla.

Este codigo de acotinuacion funciona perfectamente, y es la manera como me conecto a la base de datos con Lenguaje SQL, lo cierto es que miren el estado de la variable "conn" y diganme si esta abriendo y cerrando conex, o que me falta....

Statement stmt = null; //Variable para la conexion

try{
stmt = conn.createStatement(); //ESTABLECE LA CONEX
SQL = "SELECT * FROM AccesoX where Clave=' "+Clave+" 'and Usuario='"+Usuario+"';

ResultSet rs = stmt.executeQuery(SQL);

if (rs.next()){
DevolverEntrar(response);
}else{
Aviso="login / password Incorrectos";
PaginadeEntrada(response);
}
}

}catch (SQLException sql){
System.out.println("Se produjo un error creando la sentencia SQL de comprobacion");
System.out.println(sql.getMessage());
return;
}finally{
if(stmt != null){
try{
stmt.close();
}catch (SQLException e){
System.out.println("Error cerrando la sentencia SQL");
System.out.println(e.getMessage());
return;
}
}
return;
}

Checkenlo y diganme que tal, lo que me interesa que vean son los estados de las conexiones, supuestamente al cerrar stmt.close() cierro la conexion, es cierto o falso?

que dicen???
__________________
"Piensa como una persona de acción y actúa como una persona que piensa."
  #7 (permalink)  
Antiguo 04/11/2003, 17:25
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 2 meses
Puntos: 51
Eummm, vamos por fases de nuevo.
Si el numero de conexiones que das es real (500-10000 simultaneas) entonces agarrate al asiento que vendran curvas :). Ese numero es demasiado elevado, creo, por que si no vas a tener un problema de los buenos. Simplemente conseguir un servidor de BDD que pueda mantener todas esas conexiones abiertas a la vez ya daria suficientes dolores de cabeza ;).
.- A no ser que tengas mucho tiempo, reconvertir tu sistema de muuchos servlets en uno monoservlet seria prácticamente re-escribirlo todo, asi que no creo que sea una opción. Si tienes tiempo, casi lo mejor es usar algun framework que sea ligero, tipo WebWorks , y usar algo que ya este hecho. Nosotros hicimos el nuestro pero eso era antes de que hubiera ninguno disponible.
.- Lo que si puedes hacer es revisar el codigo que gestiona las conexiones a la BDD. Sobre lo que has escrito despues -> Hacer un stmt.close() NO CIERRA la conexion a la BDD, cierra el Statement pero la conexion sigue abierta. Ademas, si tienes peticiones simultaneas al mismo servlet y no tienes codigo de sincronización ESTAS USANDO LA MISMA CONEXION a la vez en varios sitios, asi que te dara errores, seguro. Si pruebas a crearla en cada peticion el rendimiento sera terrible, asi que me reitero: usa un pool de conexiones para acceder a las conexiones, usarlas y devolverlas al pool, La estructura del try/catch/finally es muy correcta, asi que adaptarla a un pool no te deberia ser dificil. Inicializa el pool en el init de algun servlet que tenga load-on-startup o, mejor aun, en un listener de eventos cuando se crea el servlet context.
.- La conexion a la base de datos que usas tiene escrito jdbc:odbc... pero supongo que no estaras usando el puente ODBC-JDBC del JDK, no? Esta totalmente desrecomendado por Sun para cualquier aplicación mas alla de un "HelloWorld-JDBC". Mejor consigue un driver JDBC para tu base de datos y olvidate del puente ODBC, te ahorraras problemas y aumentaras el rendimiento.
.- Aparte de eso, TESTEA TU APLICACIÓN antes de ponerla en produccion, es decir, instala una herramienta de estres (como el Web Application Stress Tool de Microsoft o el JMeter de Apache) y simula la carga que se supone tendra la aplicación, con usuarios simultaneos, trafico intentso etc. Te ahorraras muchas sorpresas ya que las pruebas manuales no se parecen, ni por asomo, al trafico real.
Suerte
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #8 (permalink)  
Antiguo 04/11/2003, 19:24
Avatar de alexbariv  
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 766
Antigüedad: 21 años, 3 meses
Puntos: 0
Mi hermano, creo que estoy muerto!!!

Si tienes messenger agregame para entrar en contacto directo, te puedo ayudar con flash, y algunos truquillos de java, python, linux y otros, pero de verdad necesito ayuda.

Solo para que sepas, el servidor de la base de datos es uno que maneja 222.559millones de conexiones porque es el ADAPTIVE SERVER ENTERPRISE.

Pero aun asi, me tiene preocupado eso que me dices

Que dices de esto?

Mi msn

[email protected]

BYE!!!
__________________
"Piensa como una persona de acción y actúa como una persona que piensa."
  #9 (permalink)  
Antiguo 05/11/2003, 12:59
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 2 meses
Puntos: 51
Hola,
Hombre, no, tampoco te queria matar del susto :), solo advertirte un poco. Veamos:
No soy un experto en aplicaciones ultramega-rapidas con millones de usuarios, pero a las mas gordas que he visto (una con un pico de 14.000 accesos en hora y media y otra con trafico sostenido desde 2.000 agencias de viajes desde todo el pais y el estranjero) les bastaba y sobraba con unas 8 y 60 conexiones abiertas respectivamente. Con mas conexiones no conseguias mayor rendimiento, ya que entonces sobrecargabas el servidor de BDD. De todas formas... 222.559 millones de conexiones? Debemos estar hablando de conceptos diferentes por que es que una maquina no tiene ni puertos TCP suficientes para abrir tantas conexiones simultaneas, al menos las que yo conozco :).
Por fases:
.- Lo mas urgente es cambiar el driver JDBC y usar un pool de conexiones como Dios manda. El resto despues.
.- Testea tu aplicacion bajo carga con alguna herramienta como las que te mencioné y comprueba que rendimiento te da, afina el numero de conexiones abiertas para obtener el mejor rendimiento vigilando tanto el servidor de aplicaciones como la BDD.

Por ultimo, no es por no ayudarte pero si es tan importante y el trafico será tan elevado, sería más conveniente que buscaras algun experto o empresa local que te ayudara a afinarla, ya que en "remoto" es bastante más complicado y no es factible hacerlo bien. Es un trabajo experto que requiere estar ahí para mirar el código, vigilar los tests... y que normalmente se cobra bien, pero si el experto es bueno merece la pena :).
Suerte.
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #10 (permalink)  
Antiguo 05/11/2003, 13:22
Avatar de alexbariv  
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 766
Antigüedad: 21 años, 3 meses
Puntos: 0
Ok, gracias de todos modos por todo!

Me haz dado ideas geniales y ya estoy trabajando en el pool y la unificacion de los servlets

Una cosa mas, conn=DriverManager.getConnection("....., consigue la conexion con la bd.

conn.close();, en el destroy, cierra la conexion.

si yo, hago una funcion, llamada por decir "cerrarconexiones(){"
y dentro coloco la sentecia conn.close(){ en un try catch, y manejando algunas excepciones, podria cerrar la conexion cuando yo quiera con mandar a llamar la funcion.

Osea, que si llamo la funcion cuando el servlet deje de trabajar y pase las variables al otro servlet o algo asi, (al final de las respuestas del dopost)

Que dices?

Que sugieres??

GRACIAS DE VERDAD POR TODO!!!
__________________
"Piensa como una persona de acción y actúa como una persona que piensa."
  #11 (permalink)  
Antiguo 05/11/2003, 15:54
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 2 meses
Puntos: 51
Hola,
Si utilizas un pool de conexiones, tu no tienes que gestionar la creación de conexiones ni su destruccion. Te tienes que preocupar de inicializar el pool y cerrarlo cuando toque, y el se encargara de abrirlas, cerrarlas, reutilizarlas... ahi esta lo bueno del pool.
En cuanto a las conexiones, de lo que te tendras que preocupar es de pedirle una conexion al pool POR PETICION, normalmente, y devolversela antes de acabar. Lo que has de hace es inicializar una referencia al pool en el init del servlet y liberarla en el destroy. Y luego tu metodo get, post o service seria algo asi como...
{
Connection miConexion = null;
try
{
miConexion = //codigo para pedir la conexion al pool
// trabajar con la conexion
}
catch(XException xe)
{
// tratamiento de errores
}
finally
{
if(miConexion!=null)
{
// DEVOLVER conexion al pool
// Ojo! Cerrar todos los statements
// y similares de forma segura antes
// de devolverla
}
}
... // mas cosas en caso necesario
}

Algo así mas o menos. Es decir, tu no abres o cierras la conexion sino que la pides y SIEMPRE la devuelves al pool. Es importante por que si dejas conexiones sin devolver, el programa acabara colgandose esperando nuevas conexiones que nunca se devuelven o sobrecargaras la BDD a conexiones abiertas.
Suerte.
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #12 (permalink)  
Antiguo 06/11/2003, 06:54
Avatar de alexbariv  
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 766
Antigüedad: 21 años, 3 meses
Puntos: 0
GRACIAS!!!!!!!!!!!!!!!!!!!!

Me haz ayudado muchisimo, ahora empezare a trabajar en esto, aun tengo que hacer otras cosas antes de ponerme a pulir los sistemas.

pero muchisimas gracias!! ya voy prevenido para lo que venga.

Si tienes algun ejemplo de codigo para el pool y me lo puedieras enviar a [email protected], si no, no importa.


GRACIAS POR TODO!!!!!!!!!!!!!


__________________
"Piensa como una persona de acción y actúa como una persona que piensa."
  #13 (permalink)  
Antiguo 06/11/2003, 18:43
Avatar de alexbariv  
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 766
Antigüedad: 21 años, 3 meses
Puntos: 0
bueno señores!!!

Lo cierto del caso es que me faltan algunos consejitos mas.

Creen que el sistema es seguro o que?

Miren:

- Todos los servlets tienen sus metodos doget y dopost en "protected"

- Se envian formularios HTML a los servlets y estos hacen el resto del trabajo.

Que tan hackeable creen el sistema?

Tomcat tiene un punto fuerte de seguridad?

Alguna idea para configurar el tomcat???

GRACIASS!!!!
__________________
"Piensa como una persona de acción y actúa como una persona que piensa."
  #14 (permalink)  
Antiguo 09/11/2003, 11:59
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 2 meses
Puntos: 51
Hola,
En principio, las cuestiones de seguridad en Java son parecidas a las de otros sistemas de aplicaciones en el servidor. Lo principal es que las conexiones vayan encriptadas con SSL, si las comunicaciones han de ser confidenciales, y verificar periodicamente que el servidor que utilices no tiene agujeros de seguridad.
Por ejemplo, hace un tiempo en algunas versiones de Tomcat, llamando a las JSP de una cierta forma te devolvia el codigo de las JSP en vez del resultado.
Otros servidores tambien tuvieron ese fallo, pero suele estar solucionado.
Por cierto "protected" en las clases/metodos de Java no tiene nada que ver con la "seguridad" que se entiende normalmente, asi que poniendolo no ganas mucho. Pero si lo que quieres es que no "extiendan" tus clases para cambiarles el comportamiento, declaralos finales y listo. Aparte de eso, si no ejecutas en el S.O. cadenas que te pasen como parametro, deberias poder estar tranquilo. Todo depende tambien de como montes tu aplicación y lo que haga esta, claro.
Saludos
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #15 (permalink)  
Antiguo 18/11/2003, 07:19
Avatar de alexbariv  
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 766
Antigüedad: 21 años, 3 meses
Puntos: 0
Este es mi nuevo pool...

Si viste, puse otro tema para tratar especificamente lo del pool de conexiones... Mira el codigo que uso para el pool:

Código PHP:

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 = ("dbX"); 
            
password = ("sXl");

            Class.
forName(driver);

            
DriverManager.setLoginTimeout(30);
            
connection DriverManager.getConnection(urlloginpassword);
            
connection.setAutoCommit(false);
            
System.out.println("Conectandose a la bd");
        }

        catch(
Exception e)

        {
            
System.out.println("Catch del conector a la bd");
            
mensajeError e.toString();
            
            
codError 1;

        }
    }

    public 
boolean doCommit()
    {
        try
        {
            
connection.commit();
            
st.close();
            
System.out.println("connection commit");
        }

        catch(
Exception e)
        {
            
System.out.println("Catch del docommit");
            
mensajeError e.toString();
            
            
codError 1;
            
            return 
false;
            
        }
        return 
true;
    }

    public 
boolean doRollback()
    {
        try
        {
            
st.close();
            
connection.rollback();
            
connection.close();
            
System.out.println("conecction roll back");
        }
        catch(
Exception e)
        {
            
System.out.println("Catch del dorollback");
            
System.out.println(e.getMessage());
            
codError 1;

            return 
false;
            
        }
        return 
true;
    }


    
    
    public 
ResultSet doSelect(String sql)
    {
        
ResultSet rs=null;
        try
        {
            
            
st connection.createStatement();
            
            
rs st.executeQuery(sql);
            
            
System.out.println("Creando la conexion");
            
        }
        catch(
Exception e)
        {
            
            
System.out.println("Catch del doselect en el pool...");
            
System.out.println(e.getMessage());
            
            
codError 1;
            
        }
         return 
rs;
    }

Que te parece?, por lo menos con esto no se me cae la base de datos como antes, y me ahorro el metodo init en todos los servlets.

Que dices con respecto al manejo de conex?

Saludos!!
__________________
"Piensa como una persona de acción y actúa como una persona que piensa."
  #16 (permalink)  
Antiguo 19/11/2003, 15:26
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 2 meses
Puntos: 51
Hola,
El codigo que me muestras no es un pool de conexiones, ya que usas una unica conexion para todos los accesos que se hagan a esta clase.
Por otro lado, esta clase no es Thread-safe, ya que no hay sincronizacion y usas siempre el mismo recurso, asi que cuando hagas un commit o intentes abrir varios resultSet a la vez, kaboum.
Mejor usa un Pool de conexiones de verdad. Algo como esto:
http://jakarta.apache.org/tomcat/tom...les-howto.html
Saludos,
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #17 (permalink)  
Antiguo 20/11/2003, 09:58
Avatar de alexbariv  
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 766
Antigüedad: 21 años, 3 meses
Puntos: 0
Mi amigo greeneyed!

Lo cierto del caso es que es cierto, hice las pruebas y salieron mal... pero mira lo que hice mezclando mi codigo con el de la pagina que me diste:

Este es el pool:

Código PHP:
package XAlX;


import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;


public final class 
poolBaseDatos
{

    
int codError 0;
    
String mensajeError "";
    
Statement st=null;
    
    
Connection connection null;

    
    public 
poolBaseDatos() 
    {
        
        try{

            
Context initContext = new InitialContext();
            
            
Context envContext  = (Context)initContext.lookup("base_datos");
            
            
DataSource ds = (DataSource)envContext.lookup("base_datos");

            
            
synchronized (ds
            {
                
connection ds.getConnection(); // cogemos la conexion
            
}
            
            
//connection.setAutoCommit(false);
            
          
        
}catch(Exception e) {
            
System.out.println("Catch del conector a la bd");
            
System.out.println(e.getMessage());
        }
        
    }

    public 
boolean doCommit()
    {
//        clearError();
        
try
        {
            
connection.commit();
            
st.close();
            
System.out.println("connection commit");
        }

        catch(
Exception e)
        {
  
//          Log.error(e);
            
System.out.println("Catch del docommit");
            
mensajeError e.toString();
            
            
codError 1;
            
            return 
false;
            
        }
        return 
true;
    }

    public 
boolean doRollback()
    {
    
//    clearError();
        
try
        {
            
st.close();
            
connection.rollback();
            
connection.close();
            
System.out.println("conecction roll back");
        }
        catch(
Exception e)
        {
   
//         Log.error(e);
            
System.out.println("Catch del dorollback");
            
System.out.println(e.getMessage());
            
codError 1;

            return 
false;
            
        }
        return 
true;
    }


    
    
    public 
ResultSet doSelect(String sql)
    {
        
ResultSet rs=null;
  
//      clearError();
        
try
        {
            
            
st connection.createStatement();
            
            
rs st.executeQuery(sql);
            
            
System.out.println("Creando la conexion");
            
        }
        catch(
Exception e)
        {
            
            
System.out.println("Catch del doselect en el pool...");
            
System.out.println(e.getMessage());
            
            
codError 1;
            
        }
         return 
rs;
    }

Desde los servlets de la aplicacion llamo a este pool a hacer operaciones basicas de esta forma:

Código PHP:
                 conn = new poolBaseDatos();
                 
String valor;
                 
int codigocodpades;

        try{
                        
SQL="SELECT codigo from Pais WHERE descripcion='";
                        
SQL+=xpais;
                        
SQL+="'";
                        
                        
ResultSet rs1;

                        
rs1 conn.doSelect(SQL);

                        
                    if (
rs1.next()){
                                
codpades  = (rs1.getInt("codigopais"));
                                do{
                                        
SQL "SELECT ";
                                        
SQL+=column1;
                                        
SQL+=",";
                                        
SQL+=column2;
                                        
SQL+=" FROM ";
                                        
SQL+=table;
                                        
SQL+=" WHERE CodPais='";
                                        
SQL+=codpades;
                                        
SQL+="'";
                                        
SQL+=" ORDER By ";
                                        
SQL+=column2;
                                        
                                        
ResultSet rs;

                                        
rs conn.doSelect(SQL);

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

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

                        return 
0;    

                }catch (
Exception e){
                        
System.out.println("Se produjo un error creando la sentencia SQL del Combo");
                        
System.out.println(e.getMessage());
                        return -
2;    
                } 
En el ficher server XML coloque esto :


Código PHP:
<Context path="/poolBaseDatos" docBase="poolBaseDatos"
        
debug="5" reloadable="true" crossContext="true">

  <
Logger className="org.apache.catalina.logger.FileLogger"
             
prefix="localhost_DBTest_log." suffix=".txt"
             
timestamp="true"/>
  
<
Resource name="Base_Datos" 
              
auth="Container"
              
type="javax.sql.DataSource"/> 

<
ResourceParams name="Base_Datos">
  <
parameter>
    <
name>factory</name>
    <
value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
  </
parameter>
  <
parameter>
    <
name>driverClassName</name>
    <
value>sun.jdbc.odbc.JdbcOdbcDriver</value>
  </
parameter>
  <
parameter>
    <
name>url</name>
    <
value>jdbc:odbc:Base_Datos</value>
  </
parameter>
  <
parameter>
    <
name>username</name>
    <
value>dba</value>
  </
parameter>
  <
parameter>
    <
name>password</name>
    <
value>sql</value>
  </
parameter>
  <
parameter>
    <
name>maxActive</name>
    <
value>20</value>
  </
parameter>
    <!-- 
Maximum number of idle dB connections to retain in pool.
         
Set to 0 for no limit.
    -->
  <
parameter>
    <
name>maxIdle</name>
    <
value>10</value>
  </
parameter>
  <
parameter>
    <
name>maxWait</name>
    <
value>-1</value>
  </
parameter>
</
ResourceParams>
</
Context
Y en el web xml del pool de conexiones, puse esto:

Código PHP:
        <resource-ref>
         <
description>pool base datos test</description>
         <
res-ref-name>jdbc:odbc:ciis_libertador</res-ref-name>
         <
res-type>javax.sql.DataSource</res-type>
         <
res-auth>Container</res-auth>
        </
resource-ref
pero al correr la aplicacion me manda un error que dice "Base_Datos no esta asociado a este contexto", esto sera porque???, la otra cosa es, que te parece este nuevo pool?, creo que ahora si deberia cumplir los requisitos pero quiero saber porque ese error de contexto.

COMO SIEMPRE ESPERANDO TU OPINION...

MUCHISIMAS GRACIAS!!!!!
__________________
"Piensa como una persona de acción y actúa como una persona que piensa."
  #18 (permalink)  
Antiguo 20/11/2003, 14:20
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 2 meses
Puntos: 51
Re: Mi amigo greeneyed!

Cita:
Mensaje Original por AleXerTecH
Lo cierto del caso es que es cierto, hice las pruebas y salieron mal...


Hombre, claro :). No te lo digo para fastidiar ;). En una aplicación web hay que probar siempre los accesos simultaneos, ya que en la realidad es lo que hay :).

Cita:
pero mira lo que hice mezclando mi codigo con el de la pagina que me diste:

Este es el pool:
...
pero al correr la aplicacion me manda un error que dice "Base_Datos no esta asociado a este contexto", esto sera porque???, la otra cosa es, que te parece este nuevo pool?, creo que ahora si deberia cumplir los requisitos pero quiero saber porque ese error de contexto.

COMO SIEMPRE ESPERANDO TU OPINION...

MUCHISIMAS GRACIAS!!!!!
El error exactamente no se por que te lo da, ya que no he usado los pools de conexiones en Tomcat (nosotros usamos Resin) pero yo empezaria haciendo una JSP, por lo de la rapidez de cambiarla, minima que simplemente capture un DataSource para comprobar que todo funciona. Cuando le tengas cogido el tranquillo, pasas a usarlo en el servlet.
De todas formas, estas usando el DataSource como si creases la conexion a mano. Es decir, estas usando UNA SOLA CONEXION todo el rato, sin sincronización y sin nada y te hará KABOUM de nuevo.
Si usas un DataSource, no necesitas crear la clase poolBaseDatos
, si no acceder al DataSource desde tus servlets, pedirle una conexion cada vez y devolversela cada vez. Asi es como se aprovechan las multiples conexiones de un pool.
Mira ejemplos de utilización en el mismo sitio donde te dije antes.
Saludos.
  #19 (permalink)  
Antiguo 20/11/2003, 15:22
Avatar de alexbariv  
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 766
Antigüedad: 21 años, 3 meses
Puntos: 0
ok... dejame ver si entendi

Lo cierto del caso es que "POOLDECONEXIONES" es algo que se configura con el tomcat y no tiene nada que ver con crear un servlet que controle las conexiones. cierto?

Lo otro, esta mal lo de los data source?, he estado mirando esa pagina y ya no doy de como hacerlo bien

Lo cierto del caso es que no he logrado solucionar el error y voy a hacer lo que dices de jsp.

y por ultimo de verdad no se como hacer para que me haga bien las conexiones entonces, el context es el que controla eso?, el synchronized no ayuda a acomodar las conexiones? que hay de malo con los DataSource??, Ya me di todos los paseos por la internet sobre las paginas, y aparentemente solo di un paso de un estancamiento a otro.

Disculpa las molestias, pero, no tienes algo de codigo que me pueda ayudar?, algo que tu tengas y sepas que funciona bien?

de nuevo mi amigo MUCHISIMAS GRACIAS!!! me ayudas enormemente con esto, y estoy en deuda contigo.!!

GRACIAS!!!
__________________
"Piensa como una persona de acción y actúa como una persona que piensa."
  #20 (permalink)  
Antiguo 21/11/2003, 03:53
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 2 meses
Puntos: 51
Cita:
Mensaje Original por AleXerTecH
ok... dejame ver si entendi
Lo cierto del caso es que "POOLDECONEXIONES" es algo que se configura con el tomcat y no tiene nada que ver con crear un servlet que controle las conexiones. cierto?
Correcto. En tus servlets solo tienes que preocuparte de pedir las conexiones, cerrar los statements y devolverselas al pool. De la gestion de abrirlas, controlarlas, etc... se ocupa el.

Cita:
Mensaje Original por AleXerTecH
Lo otro, esta mal lo de los data source?, he estado mirando esa pagina y ya no doy de como hacerlo bien
Los data source son la forma de usar el pool de conexiones. Los ejemplos estan en esa página, pero hay que leerlos con cuidado por que la configuracion es manual y es facil equivocarse.

Cita:
Mensaje Original por AleXerTecH
Lo cierto del caso es que no he logrado solucionar el error y voy a hacer lo que dices de jsp.
Basta con que configures el DataSource con nombre jdbc/TestDB y escribas una JSP con....
...
try{
Context ctx = new InitialContext();
if(ctx == null )
throw new Exception("Boom - No Context");
DataSource ds =
(DataSource)ctx.lookup( "java:comp/env/jdbc/TestDB");
if (ds != null) {
Connection conn = ds.getConnection();
if(conn != null) {
foo = "Got Connection "+conn.toString();
Statement stmt = conn.createStatement();
ResultSet rst =
stmt.executeQuery(
"select de pruebas");
if(rst.next()) {
// Probar resultado
}
conn.close();
}
}
}catch(Exception e) {
e.printStackTrace();
}

Esta sacado del ejemplo de la pagina. Cuando esto te funcione, ya tendras bien configurado el DataSource y podrás tirar para adelante.

Cita:
Mensaje Original por AleXerTecH
y por ultimo de verdad no se como hacer para que me haga bien las conexiones entonces, el context es el que controla eso?, el synchronized no ayuda a acomodar las conexiones? que hay de malo con los DataSource??, Ya me di todos los paseos por la internet sobre las paginas, y aparentemente solo di un paso de un estancamiento a otro.
Ahi estás mezclando cosas. El Context no es mas que un sitio donde se ponen cosas para compartirlas entre servlets de la misma aplicacion. Lo que controla las conexiones es el Data Source. El synchronized sirve para controlar el acceso simultaneo a recursos, sean conexiones o sea otra cosa. Si usas un pool no necesitas sincronizar el acceso a las conexiones ya que cada servlet usara una diferente. Los Data Source no tienen nada de malo :)

Cita:
Mensaje Original por AleXerTecH
Disculpa las molestias, pero, no tienes algo de codigo que me pueda ayudar?, algo que tu tengas y sepas que funciona bien?
De hecho, con Data Sources no por que no los uso. Uso algo parecido pero no estándar. Pero los ejemplos estan ahi en la pagina del Tomcat.
Sobretodo comprueba que res-ref-name(en web.xml), Resource -> name y ResourceParams -> name(en server.xml) y el lookup (en tu codigo java) usan el MISMO nombre.
Un saludo
  #21 (permalink)  
Antiguo 25/11/2003, 08:51
Avatar de alexbariv  
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 766
Antigüedad: 21 años, 3 meses
Puntos: 0
Mi amigo greeneyed!!

Denuevo aqui pidiendo tu opinion, hice lo que dice la pagina del howto de tomcat5 y creo que ya porfin lo termine..., dime que error ves para solucionarlo, pero supuestamente este es el pool, y quisiera tu opinion antes de implementarlo...

Este es el codigo que le agregue al server.xml para que vea el context:

Código PHP:
<Context path="" docBase="LoginMenuCiis"
        
debug="0" reloadable="true" 
        
crossContext="true" >
<
Resource name="jdbc/ciis_libertador"
               
auth="Container"
               
type="javax.sql.DataSource"/>


<
ResourceParams name="jdbc/ciis_libertador">
  <
parameter>
    <
name>factory</name>
    <
value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
  </
parameter>
  <
parameter>
    <
name>driverClassName</name>
    <
value>sun.jdbc.odbc.JdbcOdbcDriver</value>
  </
parameter>
  <
parameter>
    <
name>url</name>
    <
value>jdbc:odbc:ciis_libertador</value>
  </
parameter>
  <
parameter>
    <
name>username</name>
    <
value>tal</value>
  </
parameter>
  <
parameter>
    <
name>password</name>
    <
value>lat</value>
  </
parameter>
  <
parameter>
    <
name>maxActive</name>
    <
value>20</value>
  </
parameter>
     <
parameter>
    <
name>maxIdle</name>
    <
value>10</value>
  </
parameter>
  <
parameter>
    <
name>maxWait</name>
    <
value>-1</value>
  </
parameter>
</
ResourceParams>

</
Context


Este es el codigo que va en el WEB.XML del directorio donde esta contenida la aplicacion:

Código PHP:
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
        <resource-ref>
         <description>pool base datos test</description>
         <res-ref-name>jdbc/ciis_libertador</res-ref-name>
         <res-type>javax.sql.DataSource</res-type>
         <res-auth>Container</res-auth>
        </resource-ref>

</web-app>

Y AHORA LO MAS IMPORTANTE, LA MANERA COMO CONECTA EL SERVLET...

No vario mucho a la manera como lo hacia antes, pero supongo que es mejor...:

Código PHP:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;

public class 
Venezuela extends HttpServlet {


    private 
String SQL null
                       
Estado =null,
                       
Municipio null,
                       
Aviso ""
                       
SQL1null;
        

    
Connection conn null;
    
        private 
DataSource ds null;
        
     public  
void init (){
            
            
               try{

                    
Context initContext = new InitialContext();
                    
                    
ds = (DataSource)initContext.lookup("java:comp/env/jdbc/ciis_libertador");

                   
                    
synchronized (ds
                    {
                        
conn ds.getConnection(); // cogemos la conexion
                    
}


                }catch(
Exception e) {
                    
System.out.println("Catch del conector a la bd");
                    
System.out.println(e.getMessage());
                }

    }

    

        
    protected 
void doPost (HttpServletRequest requestHttpServletResponse responsethrows ServletExceptionIOException{


                        
Municipio request.getParameter("Municipio");   
    
                    
Estado request.getParameter("Estado");
                        
                        
TipoAccesorequest.getParameter("TipoAcceso");
                        
                        
int x=Integer.parseInt(TipoAcceso);
                        
                        
DevolverEntrar2(response);

                            
                        try{

                            
conn.close();

                        }catch(
Exception e) {
                            
System.out.println("Error cerrando la Conexion");
                            
System.out.println(e.getMessage());
                        }

        }

        
             public 
int actualizarCombo(String column1String column2String tableString xpais){

         
Statement stmt nullstmt1null;
                 
String valor null;
                 
int codigocodpades;

        try{
                    
stmt1 conn.createStatement();
                        
SQL1="SELECT codigopais from Paises WHERE descripcion='";
                        
SQL1+=xpais;
                        
SQL1+="'";
                        
ResultSet rs1 stmt1.executeQuery(SQL1);
                        
                    if (
rs1.next()){
                                
codpades  = (rs1.getInt("codigopais"));
                                do{
                                        
stmt conn.createStatement();
                                        
String SQL "SELECT ";
                                        
SQL+=column1;
                                        
SQL+=",";
                                        
SQL+=column2;
                                        
SQL+=" FROM ";
                                        
SQL+=table;
                                        
SQL+=" WHERE CodPais='";
                                        
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());
                                            }
                                 }while(
rs1.next());
                            }
        
                        return 
0;    
                        
        }catch (
SQLException sql){
            
System.out.println("Se produjo un error creando la sentencia SQL para el combo");
            
System.out.println(sql.getMessage());    
            return -
2;    
        }
finally{
            if(
stmt != null || stmt1 != null){
                try{
                    
stmt.close();
                                        
stmt1.close();
                }catch (
SQLException e){
                    
System.out.println("Error cerrando la sentencia SQL");
                    
System.out.println(e.getMessage());    
                    return -
3;            
                }
            }
            
        }

    } 
Observa que dejo hago una sola conn, y luego en esta hago todas las sentencias que necesito, y cierro las sentencias, y por ultimo al final del metodo dopost, cierra la conex... esta eso correcto?

Que dices??

Como siempre, y una vez mas, esperando tu opinion...

GRACIAS!!!!
__________________
"Piensa como una persona de acción y actúa como una persona que piensa."
  #22 (permalink)  
Antiguo 25/11/2003, 13:29
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 2 meses
Puntos: 51
Hola,
La configuración parece correcta y supongo que podras coger conexiones de la BDD. Eso lo sabras con las pruebas :)

Solo una cuestión respecto al código:
.- Es mejor que la conexion la declares dentro del metodo doPost, al principio, la cojas ahi del DataSource, la pases como parametro al metodo DevolverEntrar2() y despues la cierres dentro de un finally al acabar el doPost.

¿Por que? Por que si declaras la variable conn como variable global, todas las llamadas simultaneas al servlet usaran la misma y hará Kaboum :).
En cambio tener ds como variable gloabl e inicializarla en el init esta BIEN por que solo se usa para "leer".

Es decir, esquematicamente...
Código PHP:
clase X extends HttpServlet
{
  
DataSource elDataSource null;

  public 
void init()
  {
     try
     {
      
elDataSource // inicializarlo
     
}
     catch()
     {
        
elDataSource null;
        
// Guardar en los logs el error
     
}  
  }

  public 
void doPost()
  {
     if(
elDataSource!=null)
     {
       
Connection unaConexion null;
       try
       {
          
unaConexion elDataSource.getConnection();
           
// Trabajar con la conexion
           // Pasarsela como parametro a 
           // los metodos que la usen y
           // cerrar bien los statements
           // (en bloques finally)
       
}
       catch()
       {
          
// Tratar el error, guardar logs...
       
}
       
finally
       
{
          if(
unaConexion!=null)
          {
            
unaConexion.close();
          }
       }
     }
     else
     {
       
// Mostrar mensaje de error
     
}
  }

Algo asi seria la estructura basica de utilización, mentira más, mentira menos. ;)

.- Sigo recomendandote que no uses el puente JDBC-ODBC :)

Espero que te ayude.
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.

Última edición por GreenEyed; 25/11/2003 a las 13:31
  #23 (permalink)  
Antiguo 25/11/2003, 13:35
Avatar de alexbariv  
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 766
Antigüedad: 21 años, 3 meses
Puntos: 0
Bueno, la conexion a la base de datos ya la realice, todo esta correcto...

Y hare lo que dices sobre las conn, pero una ultima duda...

porque dices que no use el puente jdbc-odbc?, que tiene que ver? yo lo uso porque es el unico que conozco para conectarme a mi bd de adaptive server...

GRACIAS POR TODO MI HERMANO!!!
__________________
"Piensa como una persona de acción y actúa como una persona que piensa."
  #24 (permalink)  
Antiguo 26/11/2003, 03:31
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 2 meses
Puntos: 51
Hola,
El puente JDBC-ODBC no lo recomienda ni la propia Sun.
Es más, recomienda no usarlo para aplicaciones reales. El problema, parece ser, es que ODBC no lleva muy bien lo de la concurrencia y en entornos reales da problemas inesperados e imprevisibles. Hay otras implementaciones del puente JDBC-ODBC que dicen que son mejores, pero suelen ser de pago. Lo mejor de todo es que busques el driver JDBC puro para la base de datos que uses.
Si es adaptative server de Sybase, quiza este driver te sirva:
http://www.sybase.com/products/middl...connectforjdbc
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #25 (permalink)  
Antiguo 26/11/2003, 20:46
Avatar de alexbariv  
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 766
Antigüedad: 21 años, 3 meses
Puntos: 0
Para finalizar!!

Mi amigo greeneye, me haz ayudado muchisimo, de verdad que agradesco mucho tu ayuda... Mejore bastante mis esquemas de programacion gracias a este hilo de mensajes que hemos mantenido. Pero ya para terminar:

Mis servlets tienen muchas funciones que realizan varias entradas y salidas a la bd, por eso era que incluso en los viejos el connection conn= null;, lo tenia declarado como variable global, que pasa con esto? pues kabom, cuando entran simulteaneos 2 usuarios.

Lo que hice fue:

Connection conn = null;

synchronized (ds)
{
conn = ds.getConnection();
}

Ds = DataSource.

Cada funcion que tienen mis servlets tienen su propio conn, declarado como variable local de cada una.

Luego al entrar al try de las cosas que tiene que hacer la funcion puse el synchronized, y luego en un finally despuess de haber hecho varios statements hace un conn.close();

Con esto esta super eficiente, mucho mas que antes, y los context y demas quedaron listos.

Ahorita no estoy mudado al ASE 12.5 (Adaptive Server Enterprise) que contiene 2.500millones de conexiones a varias db, estoy haciendo el sistema sobre el ASA 8 (Adaptive Server Anywhere), que tiene un numero maximo de 20 conexiones a la bd.

Que te parece?¿

Ahora con el nuevo esquema solo tengo que mudar los driver de los context para que funcione en el nuevo Administrador de bd.

Bueno, esto te lo cuento para saber tu opinion.

Y ya finalizando este hilo, MUCHISMAS GRACIAS POR TODO!!! CUALQUIER COSA QUE NECESITES NO DUDES EN AVISARME, QUE ESPERO ALGUN DIA REGRESARTE ESTE FAVOR..

SALUDOS!!! SUERTE!!
__________________
"Piensa como una persona de acción y actúa como una persona que piensa."
  #26 (permalink)  
Antiguo 27/11/2003, 02:07
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 2 meses
Puntos: 51
Hola,
Me alegra saber que te sirve de ayuda.

El bloque synchronised alrededor de " conn = ds.getConnection();" no es necesario, ya que ese metodo ya debe ser sincronizado, asi puedes evitarte el "synchronised(ds)". Respecto a lo demas, suena estupendo.

En cuanto a la BDD... ni idea. Migrar de una a otra no deberia ser mas que cambiar el driver JDBC de una por otra, si es que hay versiones diferentes, asi que no creo que sea un problema. Me sigue sonando raro eso de las "2.500millones de conexiones", pero bueno :).
Despues solo es hacer pruebas de estres para ver los parametros de configuracion que mejor respuesta te dan (threads simultaneos en Tomcat, tamaño del pool de BDD...)
Suerte
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #27 (permalink)  
Antiguo 28/11/2003, 06:26
Avatar de alexbariv  
Fecha de Ingreso: septiembre-2003
Ubicación: Mérida, Venezuela
Mensajes: 766
Antigüedad: 21 años, 3 meses
Puntos: 0
Una pequeña estrelladita

Epale mi hermano,... un favorsito:

Para los codigos que haz visto aqui, yo necesito asignarle 2 datasource a la misma app.

Si duplico el codigo, KABUM, asi que que hago?

Osea, necesito conectarme a 2 db diferentes desde el mismo servlet
__________________
"Piensa como una persona de acción y actúa como una persona que piensa."
  #28 (permalink)  
Antiguo 28/11/2003, 10:47
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 2 meses
Puntos: 51
Hombre,
Si necesitas dos bases de datos, necesitas configurar 2 datasources diferentes con nombres diferentes; tener dos variables de tipo DataSource, cada una leyendo con un nombre diferente; tener dos variables de tipo Connection, cada una leida de un datasource...
Para gestionar transacciones que incluyan operaciones en dos BDD, tendras que mirar cosas como 2-phase-commit y similares. Ahi no me he metido de momento, asi que no te puedo decir mucho mas.
Suerte
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:40.