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

Concurrencia en java

Estas en el tema de Concurrencia en java en el foro de Java en Foros del Web. Hola , Tengo un problema de concurrencia. estoy creando una pagina web, mas bien una aplicacion web , a traves de Jsp y servlet. He ...
  #1 (permalink)  
Antiguo 27/11/2011, 06:16
 
Fecha de Ingreso: mayo-2011
Mensajes: 16
Antigüedad: 12 años, 10 meses
Puntos: 0
Concurrencia en java

Hola ,

Tengo un problema de concurrencia. estoy creando una pagina web, mas bien una aplicacion web , a traves de Jsp y servlet.

He creado un servlet , que cada vez que es ejecutado, llama a una función que actualiza una tabla en mi base de datos PostgresSql.

Pongo el codigo aquí:

miServlet
.
.
JdbcMovimientosDao.actualizaMovimiento(fecha,estad o);//aqui llama a actualizar
.
.

//fin del servlet

Y aqui la funcion actualizaMovimiento(estado):

public static boolean actualizaMovimiento(Timestamp id, String estado) {

Connection conn = null;
PreparedStatement pStm = null;
ResultSet rs = null;
int filasactualizadas=0;
boolean retorna =false;
try {
conn = DriverManager.getConnection(Constantes.conexion,Co nstantes.usuario,Constantes.pass);
conn.setAutoCommit(false);

String update = "update mercado.movimientos set estado = ? where fechamodif = ?";
pStm = conn.prepareStatement(update);
pStm.setString(1, estado);
pStm.setTimestamp(2, id);
if((filasactualizadas = pStm.executeUpdate())>0)
retorna=true;

pStm.close(); pStm = null;rs = null;
conn.commit(); conn.close(); conn = null;

} catch(Throwable t) {
logger.error("Error: " + t.getMessage().toString());
try {
if(pStm != null) pStm.close();
if(conn != null) {
conn.rollback();
conn.close();
}
return false;
} catch(SQLException sqle) { }
}
return retorna;
}

//final de la funcion


¿Como puedo hacer que se llame a esta función de manera concurrente, o sea que sea actualize la tabla mercado.movimientos, si es llamada desde varias sesiones diferentes a la vez, y esto no cause error en alguna de las actualizaciones?

Muchas gracias de antemano

Alfonso
  #2 (permalink)  
Antiguo 27/11/2011, 11:10
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 5 meses
Puntos: 454
Respuesta: Concurrencia en java

Hola:

De la concurrencia se encarga la base de datos. Algo tan simple como un update de un campo no debería darte ningún problema de concurrencia.

Otro tema es que tengas que hacer muchas transacciones con un commit al final. En ese caso la base de datos también se encarga de la concurrencia, pero si hubiera alguna discrepancia con dos hilos, al último que haga commit le daría un error.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 27/11/2011, 12:58
 
Fecha de Ingreso: mayo-2011
Mensajes: 16
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Concurrencia en java

Gracias por la respuesta,

Pues posiblemente tenga el problema que tu dices, ya que a traves de un testeo y lanzando 3 ó 4 procesos a la vez, el último(incluso alguno mas) de ellos parece que siempre falla en la actualización. No se que hace exactamente Postgresql, pero parece que se hace un lio con la actualización, y si ella es la que se encarga de la concurrencia, parece ser que falla.

He utilizado la clase connection.setTransactionIsolation(Transaction.Ser ializable), pero tampoco funciona.

Incluso he utilizado algo del PostgreSql como un select for update, y despues el propio update, pero no ha funcionado.

Pienso que lo unico que puedo hacer es crear un bucle en el servlet que intente actualizar hasta que encuentre un hueco para actualizar, ó que la funcion actualizaMovimiento sea recursiva y se llame a si misma hasta que pueda actualizar.

La verdad es que no se que hacer.

Muchas gracias

Alfonso
  #4 (permalink)  
Antiguo 27/11/2011, 14:57
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 5 meses
Puntos: 454
Respuesta: Concurrencia en java

"parece ser que falla". ¿qué quiere decir eso exactamente? ¿Por qué piensas que es la concurrencia? ¿qué fallo te está dando?

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 28/11/2011, 14:18
 
Fecha de Ingreso: mayo-2011
Mensajes: 16
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Concurrencia en java

Cuando digo que falla me refiero a que no actualiza bien.

La cuestión es que tengo un pequeño programa de testeo que lanza peticiones al servlet , y lo que hago es ejecutar 4 procesos de dicho programa de testeo , lanzando 4 peticiones a la vez, cuando se ejecuta la funcion de actualizaMovimiento , alguna de las peticiones lanzadas crea una excepcion iendose por el catch y devuelve un error de actualizacion en un log que recojo en otro lado.

De todas maneras seguire buscando

He estado investigando y he encontrado esto lo mismo sirve de ayuda a alguien:

http://jdbc.postgresql.org/documentation/84/tomcat.html

http://www.javamexico.org/blogs/ezamudio/concurrencia_sin_dolor_en_java_puro_parte_1

El primero habla de configurar el TOmcat para crear un pool de conexiones

El segundo presenta 4 metodos para la concurrencia en java.

Un saludo

Alfonso
  #6 (permalink)  
Antiguo 28/11/2011, 14:28
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 5 meses
Puntos: 454
Respuesta: Concurrencia en java

Pues si pones la excepción tal cual salta (no sólo con el texto, sino la excepción completa), es más fácil que te podamos ayudar a encontrar el motivo del error.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #7 (permalink)  
Antiguo 29/11/2011, 06:03
 
Fecha de Ingreso: mayo-2011
Mensajes: 16
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Concurrencia en java

Al final he descubierto lo que pasaba, pero todavia no lo he arreglado, en la funcion actualizaMovimiento, que tiene dos parametros, uno de ellos es un objeto estado de tipo String y que en MiServlet, lo he puesto de tipo global.
Cuando se lanzan las peticiones obtiene un estado por cada peticion, pero parece ser que de la primera petición a la 2 petición, al hacerse las peticiones casi a la vez , en la primera petición se recoge el objeto estado de la 2 petición, y claro así da error.

O sea:

1 peticion :

Estado = Iniciado

2 peticion :

Estado = OK


1 petición :


actualizaMovimiento(time, OK)//aqui recoge el objeto estado de la segunda petición y esto es erroneo

2 petición:

actualizaMovimiento(time, OK)// aqui esta bien




Podriamos decir que cada petición esta cogiendo el objeto del siguiente,o sea que el objeto de miServlet-Estado , no se mantiene en cada petición si no que directamente por cada hilo que se abre se mantiene dicho Objeto con los valores nuevos que se le de.

No mando la excepcion , por que al final no habia ninguna excepcion en actualizar, si no es problema del propio objeto.

Un saludo

Alfonso

Etiquetas: jsp
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:13.