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, 6 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, 4 meses
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, 6 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, 5 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, 6 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, 6 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, 5 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, 6 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, 5 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, 6 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."
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 21:56.